home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs49.d81 / hack10b.sfx / issue10b
Text File  |  1990-02-12  |  81KB  |  1,995 lines

  1. ╔N THE CODE, THERE ARE SOME COMMENTS THAT DOCUMENT THE VIDEO TIMING,
  2. LIKE THIS ONE:
  3.  
  4. ;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
  5. ;SSSSSSSSSS                                               ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
  6. ;==========XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX▄▄╪╪╪====== ╨HI-2 6510
  7. ;          ^ NOW WE ARE HERE
  8.  
  9. ╘HE TWO VERTICAL BARS "▄" DENOTE OPTIONAL CYCLES.  ╧N ╨┴╠-┬ SYSTEMS
  10. (63 CYCLES PER LINE), THEY ARE NOT PRESENT.  ╧N 6567╥56┴, WHICH HAS 64
  11. CYCLES PER LINE, THERE IS ONE ADDITIONAL CYCLE ON THIS POSITION, AND
  12. THE 6567╥8 HAS TWO ADDITIONAL CYCLES THERE.
  13.  
  14. ╘HE NUMBERS 0 THROUGH 7 ARE SPRITE POINTER FETCHES (FROM THE END OF
  15. THE CHARACTER MATRIX, E.G. THE TEXT SCREEN), THE "S" CHARACTERS DENOTE
  16. SPRITE IMAGE FETCHES, THE "R"S ARE MEMORY REFRESH, AND THE "G" ARE
  17. GRAPHICS FETCHES.  ╘HE TWO IDLE VIDEO CHIP CYCLES ARE MARKED WITH "-".
  18. ╧N THE PROCESSOR TIMING LINE, THE "=" SIGNS SHOW HALTED ├╨╒, "X" MEANS
  19. FREE BUS, AND "╪" MEANS THAT THE PROCESSOR WILL BE HALTED AT ONCE,
  20. UNLESS IT IS PERFORMING WRITE CYCLES.
  21.  
  22.   PROCESSOR 6502
  23.  
  24. ; ╙ELECT THE VIDEO TIMING (PROCESSOR CLOCK CYCLES PER RASTER LINE)
  25. ├┘├╠┼╙ = 65     ; 6567╥8 AND ABOVE, ╬╘╙├-═
  26. ;├┘├╠┼╙ = 64    ; 6567╥5 6┴, ╬╘╙├-═
  27. ;├┘├╠┼╙ = 63    ; 6569 (ALL REVISIONS), ╨┴╠-┬
  28.  
  29. CINV = $314
  30. CNMI = $318
  31. RASTER = 52     ; START OF RASTER INTERRUPT
  32. M = $FB         ; ZERO PAGE VARIABLE
  33.  
  34.   .ORG $801
  35. BASIC:
  36.   .WORD 0$      ; LINK TO NEXT LINE
  37.   .WORD 1995    ; LINE NUMBER
  38.   .BYTE $9┼     ; ╙┘╙ TOKEN
  39.  
  40. ; ╙┘╙ DIGITS
  41.  
  42.   .IF (* + 8) / 10000
  43.   .BYTE $30 + (* + 8) / 10000
  44.   .ENDIF
  45.   .IF (* + 7) / 1000
  46.   .BYTE $30 + (* + 7) % 10000 / 1000
  47.   .ENDIF
  48.   .IF (* + 6) / 100
  49.   .BYTE $30 + (* + 6) % 1000 / 100
  50.   .ENDIF
  51.   .IF (* + 5) / 10
  52.   .BYTE $30 + (* + 5) % 100 / 10
  53.   .ENDIF
  54.   .BYTE $30 + (* + 4) % 10
  55.  
  56. 0$:
  57.   .BYTE 0,0,0   ; END OF ┬┴╙╔├ PROGRAM
  58.  
  59. START:
  60.   JMP INSTALL
  61.   JMP DEINSTALL
  62.  
  63. INSTALL:        ; INSTALL THE RASTER ROUTINE
  64.   JSR RESTORE   ; ─ISABLE THE ╥ESTORE KEY (DISABLE ╬═╔ INTERRUPTS)
  65. CHECKIRQ:
  66.   LDA CINV      ; CHECK THE ORIGINAL ╔╥╤ VECTOR
  67.   LDX CINV+1    ; (TO AVOID MULTIPLE INSTALLATION)
  68.   CMP #<IRQ1
  69.   BNE IRQINIT
  70.   CPX #>IRQ1
  71.   BEQ SKIPINIT
  72. IRQINIT:
  73.   SEI
  74.   STA OLDIRQ    ; STORE THE OLD ╔╥╤ VECTOR
  75.   STX OLDIRQ+1
  76.   LDA #<IRQ1
  77.   LDX #>IRQ1
  78.   STA CINV      ; SET THE NEW INTERRUPT VECTOR
  79.   STX CINV+1
  80. SKIPINIT:
  81.   LDA #$1B
  82.   STA $D011     ; SET THE RASTER INTERRUPT LOCATION
  83.   LDA #RASTER
  84.   STA $D012
  85.   LDX #$E
  86.   CLC
  87.   ADC #3
  88.   TAY
  89.   LDA #0
  90.   STA M
  91. 0$:
  92.   LDA M
  93.   STA $D000,X   ; SET THE SPRITE ╪
  94.   ADC #24
  95.   STA M
  96.   TYA
  97.   STA $D001,X   ; AND ┘ COORDINATES
  98.   DEX
  99.   DEX
  100.   BPL 0$
  101.   LDA #$7F
  102.   STA $DC0D     ; DISABLE TIMER INTERRUPTS
  103.   STA $DD0D
  104.   LDX #1
  105.   STX $D01A     ; ENABLE RASTER INTERRUPT
  106.   LDA $DC0D     ; ACKNOWLEDGE ├╔┴ INTERRUPTS
  107.   LSR $D019     ; AND VIDEO INTERRUPTS
  108.   LDY #$FF
  109.   STY $D015     ; TURN ON ALL SPRITES
  110.   CLI
  111.   RTS
  112.  
  113. DEINSTALL:
  114.   SEI           ; DISABLE INTERRUPTS
  115.   LDA #$1B
  116.   STA $D011     ; RESTORE TEXT SCREEN MODE
  117.   LDA #$81
  118.   STA $DC0D     ; ENABLE ╘IMER ┴ INTERRUPTS ON ├╔┴ 1
  119.   LDA #0
  120.   STA $D01A     ; DISABLE VIDEO INTERRUPTS
  121.   LDA OLDIRQ
  122.   STA CINV      ; RESTORE OLD ╔╥╤ VECTOR
  123.   LDA OLDIRQ+1
  124.   STA CINV+1
  125.   BIT $DD0D     ; RE-ENABLE ╬═╔ INTERRUPTS
  126.   CLI
  127.   RTS
  128.  
  129. ; ┴UXILIARY RASTER INTERRUPT (FOR SYNCRONIZATION)
  130. IRQ1:
  131. ; IRQ (EVENT)   ; > 7 + AT LEAST 2 CYCLES OF LAST INSTRUCTION (9 TO 16 TOTAL)
  132. ; PHA           ; 3
  133. ; TXA           ; 2
  134. ; PHA           ; 3
  135. ; TYA           ; 2
  136. ; PHA           ; 3
  137. ; TSX           ; 2
  138. ; LDA $0104,X   ; 4
  139. ; AND #XX       ; 2
  140. ; BEQ           ; 3
  141. ; JMP ($314)    ; 5
  142.                 ; ---
  143.                 ; 38 TO 45 CYCLES DELAY AT THIS STAGE
  144.   LDA #<IRQ2
  145.   STA CINV
  146.   LDA #>IRQ2
  147.   STA CINV+1
  148.   NOP           ; WASTE AT LEAST 12 CYCLES
  149.   NOP           ; (UP TO 64 CYCLES DELAY ALLOWED HERE)
  150.   NOP
  151.   NOP
  152.   NOP
  153.   NOP
  154.   INC $D012     ; ┴T THIS STAGE, $D012 HAS ALREADY BEEN INCREMENTED BY ONE.
  155.   LDA #1
  156.   STA $D019     ; ACKNOWLEDGE THE FIRST RASTER INTERRUPT
  157.   CLI           ; ENABLE INTERRUPTS (THE SECOND INTERRUPT CAN NOW OCCUR)
  158.   LDY #9
  159.   DEY
  160.   BNE *-1       ; DELAY
  161.   NOP           ; ╘HE SECOND INTERRUPT WILL OCCUR WHILE EXECUTING THESE
  162.   NOP           ; TWO-CYCLE INSTRUCTIONS.
  163.   NOP
  164.   NOP
  165.   NOP
  166. OLDIRQ = * + 1  ; ╨LACEHOLDER FOR SELF-MODIFYING CODE
  167.   JMP *         ; ╥ETURN TO THE ORIGINAL INTERRUPT
  168.  
  169. ; ═AIN RASTER INTERRUPT
  170. IRQ2:
  171. ; IRQ (EVENT)   ; 7 + 2 OR 3 CYCLES OF LAST INSTRUCTION (9 OR 10 TOTAL)
  172. ; PHA           ; 3
  173. ; TXA           ; 2
  174. ; PHA           ; 3
  175. ; TYA           ; 2
  176. ; PHA           ; 3
  177. ; TSX           ; 2
  178. ; LDA $0104,X   ; 4
  179. ; AND #XX       ; 2
  180. ; BEQ           ; 3
  181. ; JMP (CINV)    ; 5
  182.                 ; ---
  183.                 ; 38 OR 39 CYCLES DELAY AT THIS STAGE
  184.   LDA #<IRQ1
  185.   STA CINV
  186.   LDA #>IRQ1
  187.   STA CINV+1
  188.   LDX $D012
  189.   NOP
  190. #IF ├┘├╠┼╙ - 63
  191. #IF ├┘├╠┼╙ - 64
  192.   NOP           ; 6567╥8, 65 CYCLES/LINE
  193.   BIT $24
  194. #ELSE
  195.   NOP           ; 6567╥56┴, 64 CYCLES/LINE
  196.   NOP
  197. #ENDIF
  198. #ELSE
  199.   BIT $24       ; 6569, 63 CYCLES/LINE
  200. #ENDIF
  201.   CPX $D012     ; ╘HE COMPARISON CYCLE IS EXECUTED ├┘├╠┼╙ OR ├┘├╠┼╙+1 CYCLES
  202.                 ; AFTER THE INTERRUPT HAS OCCURRED.
  203.   BEQ *+2       ; ─ELAY BY ONE CYCLE IF $D012 HADN'T CHANGED.
  204.                 ; ╬OW EXACTLY ├┘├╠┼╙+3 CYCLES HAVE PASSED SINCE THE INTERRUPT.
  205.   DEX
  206.   DEX
  207.   STX $D012     ; RESTORE ORIGINAL RASTER INTERRUPT POSITION
  208.   LDX #1
  209.   STX $D019     ; ACKNOWLEDGE THE RASTER INTERRUPT
  210.   LDX #2
  211.   DEX
  212.   BNE *-1
  213.   NOP
  214.   NOP
  215.   LDA #20       ; SET THE AMOUNT OF RASTER LINES-1 FOR THE LOOP
  216.   STA M
  217.   LDX #$C8
  218. IRQLOOP:
  219.   LDY #2
  220.   DEY
  221.   BNE *-1       ; DELAY
  222.   DEC $D016     ; NARROW THE SCREEN (EXACT TIMING REQUIRED)
  223. ;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
  224. ;SSSSSSSSSS                                               ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
  225. ;==========XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX▄▄╪╪╪====== ╨HI-2 6510
  226. ;          ^ NOW WE ARE HERE
  227.   STX $D016     ; EXPAND THE SCREEN
  228. #IF ├┘├╠┼╙ - 63
  229. #IF ├┘├╠┼╙ - 64
  230.   BIT $24       ; 6567╥8
  231. #ELSE
  232.   NOP           ; 6567╥56┴
  233. #ENDIF
  234. #ELSE
  235.   NOP           ; 6569
  236. #ENDIF
  237.   DEC M
  238.   BMI ENDIRQ
  239.   CLC
  240.   LDA $D011
  241.   SBC $D012
  242.   AND #7
  243.   BNE IRQLOOP   ; ╘HIS INSTRUCTION TAKES 4 CYCLES INSTEAD OF 3,
  244.                 ; BECAUSE THE PAGE BOUNDARY IS CROSSED.
  245. BADLINE:
  246.   DEC M
  247.   NOP
  248.   NOP
  249.   NOP
  250.   NOP
  251.   DEC $D016
  252. ;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
  253. ;SSSSSSSSSS    CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC   ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
  254. ;==========X╪╪╪========================================▄▄***====== ╨HI-2 6510
  255. ;          ^ WE ARE HERE
  256.   STX $D016
  257. ;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
  258. ;SSSSSSSSSS                                               ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
  259. ;==========XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX▄▄╪╪╪====== ╨HI-2 6510
  260. ;          ^ ^^- WE ARE HERE (6569)
  261. ;          ▄ \- OR HERE (6567╥56┴)
  262. ;          \- OR HERE (6567╥8)
  263.   LDY #2
  264.   DEY
  265.   BNE *-1
  266.   NOP
  267.   NOP
  268. #IF ├┘├╠┼╙ - 63
  269. #IF ├┘├╠┼╙ - 64
  270.   NOP           ; 6567╥8, 65 CYCLES/LINE
  271.   NOP
  272.   NOP
  273. #ELSE
  274.   BIT $24       ; 6567╥56┴, 64 CYCLES/LINE
  275. #ENDIF
  276. #ELSE
  277.   NOP           ; 6569, 63 CYCLES/LINE
  278. #ENDIF
  279.   DEC M
  280.   BPL IRQLOOP   ; ╘HIS IS A 4-CYCLE BRANCH (PAGE BOUNDARY CROSSED)
  281. ENDIRQ:
  282.   JMP $EA81     ; RETURN TO THE AUXILIARY RASTER INTERRUPT
  283.  
  284. RESTORE:        ; DISABLE THE ╥ESTORE KEY
  285.   LDA CNMI
  286.   LDY CNMI+1
  287.   PHA
  288.   LDA #<NMI     ; ╙ET THE ╬═╔ VECTOR
  289.   STA CNMI
  290.   LDA #>NMI
  291.   STA CNMI+1
  292.   LDX #$81
  293.   STX $DD0D     ; ┼NABLE ├╔┴ 2 ╘IMER ┴ INTERRUPT
  294.   LDX #0
  295.   STX $DD05
  296.   INX
  297.   STX $DD04     ; ╨REPARE ╘IMER ┴ TO COUNT FROM 1 TO 0.
  298.   LDX #$DD
  299.   STX $DD0E     ; ├AUSE AN INTERRUPT.
  300. NMI = * + 1
  301.   LDA #$40      ; ╥╘╔ PLACEHOLDER
  302.   PLA
  303.   STA CNMI
  304.   STY CNMI+1    ; RESTORE ORIGINAL ╬═╔ VECTOR (ALTHOUGH IT WON'T BE USED)
  305.   RTS
  306.  
  307.  
  308. ┬INARIES
  309.  
  310. ╚ERE ARE THE PROGRAMS IN UUENCODED FORMAT.  ╞IRST THE ╓╔├-20 PROGRAMS:
  311.  
  312. ├OLOR BOXES FOR THE ╓╔├-20, ╬╘╙├-═ VERSION (PROBABLY DISTORTED DISPLAY):
  313.  
  314. BEGIN 644 COPPER.6560
  315. ═└1└*$,╠'╟├0╤,#─└└└"╔?╪╘╬─8╘═─8╘>─:(<[└20╘/╬@"20─╦@20┬┬0─)"2┬
  316. ═%<╦0_<╘$─+└└┬-#╦╩4"-&┘&-*┘&╔0┌)"├1:1├2:1╚└:(╘/╘─)(╪┼─:└*┬-#]
  317. ═├┴61╩6╥-%└.╔$(╘5└┌╟└├2┌18*╘4─<─(─└1(:"─'╥020!"0─*0/)└╦└└╠└!*
  318. ═╠└"@$*╘/─*╔)]╪╘/─(╪/─(╘/─(╪/─(╘/─(╪/─(╘/─(╪/─(╘/─(╪/─(╘/─(╪/
  319. ,─$┴╚)"3╩┬-#43+_╩
  320. END
  321.  
  322.  
  323. ├OLOR BOXES FOR THE ╓╔├-20, ╨┴╠-┬ VERSION:
  324.  
  325. BEGIN 644 COPPER.6561
  326. ═└1└*$,╠'╟├0╤,#─└└└"╔?╪╘╬─8╘═─8╘>─:(<[└20╘/╬@"20─╦@20┬┬0─╚┴├*
  327. ═╘/╫-!)"╨└(├0[:┼└├1╬1├2╬1╩8:┬5╚╘6─8╘╞─:└'┬-#]┌╬╩.)9&@"╚├0_8╪5
  328. ═─:┼╩├10#╩1"-%0.╔╨(╘╬─6"═%)')")└$2&@╔!\─$─└0─)"─#╥0*╨└+└└2╦└└
  329. ═╚!"═#┘"╩2?>-#┘".#┘"-#┘".#┘"-#┘".#┘"-#┘".#┘"-#┘".#┘"-#┘".#┘!(
  330. +:$┴╚┌╬╩(╘--,╧^╩.
  331. END
  332.  
  333.  
  334. ╥EMOVED SIDEBORDERS WITH 8 SPRITES AND BAD LINES, ╨┴╠-┬ VERSION:
  335.  
  336. BEGIN 644 RASTER.63
  337. ═└0@*",╠'╟├(╨-├$└└└!,$╨┴,=└@@'0╞═%└.╬%0/)┼=└$╪└├╨$7┬-╬0┬.╬@┬╔
  338. ═┼:((├10#├┴4#╩1╬-$="╔-(╘2╘*(.&&─#╩*─└┴?╬┼^┘╘└╘&─8┴?╬8╟0'0╥╠╚0
  339. ═[┌┼_├0╫<├0╫=╚@&.&═"═#=╤.&="@_╪╨5╘%┴@>*─;├1'0╩8&-#=╥╔└(╘:╘*╓┘
  340. ═"(╘4└┌╓┌"(╘5└╥╨-╫5┴@╩;╬-%└.╔"(╘5└^╦╩┌╬╦╩┌╬╪2╘*─!├1╟06*└)┬-#]
  341. ═┌╬╦╩┌╬╔,╬└┬╔┼8╘4└┌─(├14#╦┴+0┌┬0─[!+0\└#*╥╚╪2╘*(!├┴╟0╚@+*╘/╫╩
  342. ═┌╩─4┴?╬┬╥*└"┬-#]╙┴;0├┴;0┌╠;[,",8╦1'0[1+0*0?0┘<;[┌╬╦╩┌╠╪6╘(╪6
  343. ═╘*└"┬-#]┌╬╦╩╤╧╠0╙4╥!┌╩╘8└┌╨9└╘┬╔0╚╘8└┌─)├1─#╚╚&.#=╓┬└(╪%╫>┬.
  344. 1!-╓┬╫8╪.╫:┼└:(╘8└╪╨9└╓└8
  345. END
  346.  
  347.  
  348. ╥EMOVED SIDEBORDERS WITH 8 SPRITES AND BAD LINES, 6567╥56┴ VERSION
  349. (VERY OLD ╬╘╙├-═ ├64S):
  350.  
  351. BEGIN 644 RASTER.64
  352. ═└0@*",╠'╟├(╨-├$└└└!,$╨┴,=└@@'@╞═%└.╬%0/)┼=└$╪└├╨$7┬-╬0┬.╬@┬╔
  353. ═┼:((├10#├┴4#╩1╬-$="╔-(╘2╘*(.&&─#╩*─└┴?╬┼^┘╘└╘&─8┴?╬8╟0'0╥╠╚0
  354. ═[┌┼_├0╫<├0╫=╚@&.&═"═#=╤.&="@_╪╨5╘%┴@>*─;├1'0╩8&-#=╥╔└(╘:╘*╓┘
  355. ═"(╘4└┌╓┌"(╘5└╥╨-╫5┴@╩;╬-%└.╔"(╘5└^╦╩┌╬╦╩┌╬╪2╘*─!├1╟06*└)┬-#]
  356. ═┌╬╦╩┌╬╔,╬└┬╔┼8╘4└┌─(├14#╦┴+0┌╬╦╩[!+0\└#*╥╚╪2╘*(!├┴╟0╚@+*╘/╫╩
  357. ═┌╩─4┴?╬┬╥*└"┬-#]╙┴;0├┴;0┌╠;[,"08╦1'0[1+0*0?0┘<;[┌╬╦╩┌╠╪6╘(╪6
  358. ═╘*└"┬-#]┌╬╚─),;[$,╤,@>╩═&└.╠&0-(╩4.-&└.╔"8╘9└┌*!├@╫=╚@".!=╫╚
  359. 2├@3=╚═╓.#═╓╔0&┬-&└.,&0-@
  360. END
  361.  
  362. ╥EMOVED SIDEBORDERS WITH 8 SPRITES AND BAD LINES, 6567╥8 AND ABOVE
  363. (NOT TOO OLD ╬╘╙├-═ ├64S AND ALL ├128S)
  364.  
  365. BEGIN 644 RASTER.65
  366. ═└0@*",╠'╟├(╨-├$└└└!,$╨┴,=└@@(0╞═%└.╬%0/)┼=└$╪└├╨$7┬-╬0┬.╬@┬╔
  367. ═┼:((├10#├┴4#╩1╬-$="╔-(╘2╘*(.&&─#╩*─└┴?╬┼^┘╘└╘&─8┴?╬8╟0'0╥╠╚0
  368. ═[┌┼_├0╫<├0╫=╚@&.&═"═#=╤.&="@_╪╨5╘%┴@>*─;├1'0╩8&-#=╥╔└(╘:╘*╓┘
  369. ═"(╘4└┌╓┌"(╘5└╥╨-╫5┴@╩;╬-%└.╔"(╘5└^╦╩┌╬╦╩┌╬╪2╘*─!├1╟06*└)┬-#]
  370. ═┌╬╦╩┌╬╔,╬└┬╔┼8╘4└┌─(├14#╦┴+0┌╬╚─).╨2╘/└└╥╠╩.$═"┬└8╪9╘*("╥═#]
  371. ═┌╬╩╔%(7[╚╠┬@└╚├0_<╪6╘(╪6╘"0─╤╧╠╨)1┬═$=#═$═└╔!]#─╤╧╧╩┌╬╦╩╙┴;0
  372. ═├┴;0╚└*(╘/╫╩┌╬╦╩┌╠;[$,╔,@>╩═&└.╠&0-(╩4:-&└.╔"8╘9└┌*!├@╫=╚@".
  373. 5!=╫╚├@3=╚═╓.#═╓╔0&┬-&└.,&0-@
  374. END
  375.  
  376.  
  377. ╘HAT WAS ALL, FOLKS!  ╔ HOPE YOU LEARNED SOMETHING FROM THIS ARTICLE.
  378. ╞EEL FREE TO E-MAIL ME AT ═ARKO.═AKELA@╚╒╘.╞╔, SHOULD ANYTHING REMAIN
  379. UNCLEAR.
  380.  
  381. ========================================================================
  382. ┴ ─IFFERENT ╨ERSPECTIVE, PART ╔╔╔
  383. BY ╙TEPHEN ╩UDD --- SJUDD@NWU.EDU    
  384.    ╟EORGE ╘AYLOR --- AA601@CFN.CS.DAL.CA
  385.  
  386.         ╫HEW!  ╫HAT A BUSY TIME IT'S BEEN -- RESEARCH TO GET DONE,
  387. CONFERENCES, CLASSES... BETWEEN GETTING THINGS DONE AND BLOWING OTHER
  388. THINGS OFF, ╔ ONE DAY REFLECTED FOR A MOMENT AND REALIZED THAT ╔ HAD
  389. THREE DAYS LEFT TO GET THE NEXT ARTICLE TOGETHER FOR ├=╚ACKING!  ╙O
  390. EVERYTHING HAS BEEN SLAPPED TOGETHER AT THE LAST MINUTE, AND ╔ HOPE
  391. YOU'LL FORGIVE ANY BUGS OR UNCLEAR CONCEPTS.
  392.                 >>> ┴╬┼├─╧╘┼ ┴╠┼╥╘ <<<
  393.         ┴ND THAT REMINDS ME: ╔ JUST GOT ╩IFFY─╧╙ AND AN ╞─-2000 DRIVE --
  394. WHAT A WONDERFUL DEVICE.  ╔ HAVE A 1.6 MEGABYTE DISK FORMATTED INTO
  395. THREE PARTITIONS.  ╘HE FIRST CONTAINS MY ═ERLIN 128 ASSEMBLER, THE
  396. SECOND IS SOME 4000 BLOCKS LARGE AND ╔ USE IT FOR ALL MY VARIOUS
  397. VERSIONS OF CODE WHILE DEBUGGING, AND THE THIRD IS MAYBE 1000 BLOCKS,
  398. AND CONTAINS ONLY FINISHED CODE -- NO MORE SWAPPING DISKS, NO MORE
  399. DELETING OLD VERSIONS THAT ╔ HOPE ╔ DON'T NEED TO MAKE ROOM ON THE
  400. DISK.  ┴LSO, WHEN ╔ INSTALLED ╩IFFY─╧╙ ╔ FOUND A SERIOUS BUG IN MY
  401. 128─ -- A CRICKET, DEAD AMONG THE ╔├'S.
  402.  
  403.         ╘HIS TIME WE WILL COVER A LOT OF GROUND WHICH ISN'T SO MUCH
  404. CUTTING-EDGE AS IT IS VERY USEFUL.  ╠ET'S FACE IT: CUBES ARE GETTING
  405. MORE THAN A LITTLE DULL.  ┴ WORTHY END GOAL IS TO HAVE A COMPLETELY
  406. GENERAL ROUTINE FOR PLOTTING A SERIES OF POLYGONS -- THAT IS, YOU SUPPLY
  407. A LIST OF (X,Y,Z) COORDINATES FROM WHICH THE PROGRAM CAN FORM A LIST OF
  408. POLYGONS.  ╘HESE POLYGONS MAY THEN BE DISPLAYED IN 2─, ROTATED, MAGNIFIED,
  409. FILLED, ETC.  ┴ND, MUCH TO MY THREE-DAY ASTONISHMENT, THAT IS EXACTLY
  410. WHAT WE ARE GOING TO DO.
  411.         ┬UT FIRST, A LITTLE EXCURSION.  ╧NE THING WE ARE OF COURSE ALWAYS
  412. THINKING ABOUT IS OPTIMIZATION POSSIBILITIES: IN THE SHOWER, WHILE
  413. SLEEPING/DREAMING, OUT ON DATES, ETC.  ╙O, WHERE TO BEGIN?  ╘HE BIGGEST
  414. CYCLE HOGS IN THE PROGRAM ARE LINE DRAWING AND FACE FILLING -- WELL,
  415. FILLING FACES IS PRETTY STRAIGHTFORWARD.  ╫HAT ABOUT LINE DRAWING?
  416.         ╫ELL, ONE DOWNER OF THE ROUTINE IS THAT EVERY SINGLE PIXEL IS
  417. PLOTTED.  ┬UT AS WE KNOW, ON A COMPUTER ANY GIVEN LINE IS MADE UP OF
  418. SEVERAL SMALLER VERTICAL AND HORIZONTAL LINES -- WOULDN'T IT BE NEAT
  419. IF WE COULD THINK OF A WAY TO PLOT THESE LINE CHUNKS ALL AT ONCE,
  420. INSTEAD OF A PIXEL AT A TIME?
  421.         ╚ECK YES IT WOULD!  ╙O HERE WE GO:
  422.         
  423. ╬EAT-O ┼NHANCED ├HUNKY ╠INE ─RAWING ╥OUTINE
  424. -------------------------------------------
  425.  
  426.         ╞IRST WE NEED TO BE IN THE RIGHT MINDFRAME.  ╠ET'S SAY YOU'RE
  427. DRAWING A LINE WHERE YOU MOVE THREE PIXELS IN X BEFORE IT'S TIME TO TAKE
  428. A STEP IN Y.  ╔NSTEAD OF PLOTTING ALL THREE PIXELS IT WOULD OF COURSE
  429. BE MUCH MORE EFFICIENT TO JUST STICK A NUMBER LIKE %00011100 IN THE
  430. DRAWING BUFFER.  ┬UT SOMEHOW WE NEED TO KEEP TRACK OF A) HOW LARGE THE
  431. CHUNK NEEDS TO BE, AND B) WHERE EXACTLY THE CHUNK IS.
  432.         ╔N THE ABOVE EXAMPLE, WE STARTED AT A PARTICULAR X-VALUE:
  433.  
  434.         %00010000
  435.  
  436. AND WE WANT TO KEEP ADDING ONES TO THE RIGHT OF THE STARTING POINT; THREE,
  437. TO BE EXACT.  ╚MMM... WE NEED TO SOMEHOW ROTATE THE STARTING BIT IN A WAY
  438. THAT LEAVES A TRAIL OF ONES BEHIND IT.  ═AYBE ROTATE AND ╧╥┴ WITH THE
  439. ORIGINAL BIT?  ┬UT WHAT HAPPENS WHEN YOU TAKE A STEP IN ┘?
  440.         ╬O, WE NEED SOMETHING FAR SNEAKIER.  ╠ET'S SAY THAT INSTEAD OF
  441. %00010000 WE START WITH
  442.  
  443.         X = %00011111
  444.  
  445. ╬OW, WITH EACH STEP IN THE X DIRECTION, WE DO AN ARITHMETIC SHIFT ON X.  ╙O
  446. AFTER ONE STEP WE HAVE
  447.  
  448.         X = %00001111
  449.  
  450. AND AFTER TWO STEPS
  451.  
  452.         X = %00000111
  453.  
  454. AND AT THE THIRD STEP OF COURSE
  455.  
  456.         X = %00000011
  457.  
  458. ╬OW IT IS TIME TO TAKE A STEP IN ┘.  ┬UT NOW LOOK: IF WE ┼╧╥ X WITH ITS
  459.  
  460. ORIGINAL VALUE XOLD = %00011111, WE GET
  461.  
  462.         X ┼╧╥ XOLD = %00011100
  463.  
  464. WHICH IS EXACTLY THE CHUNK WE WANTED.  ═OREOVER, X STILL REMEMBERS WHERE IT
  465. IS, SO WE DON'T HAVE TO DO ANYTHING SPECIAL EACH TIME A STEP IS TAKEN IN
  466. THE Y-DIRECTION.
  467.  
  468.         ╙O HERE IS THE ALGORITHM FOR DRAWING A LINE IN THE X-DIRECTION:
  469.  
  470.         INITIALIZE X, DX, ETC.
  471.         XOLD = X
  472.         TAKE A STEP IN X: ╠╙╥ ╪
  473.         HAVE WE HIT THE END OF A COLUMN?  ╔F SO, THEN PLOT AND CHECK ON Y
  474.         IS IT TIME TO TAKE A STEP IN Y?
  475.         IF NOT, TAKE ANOTHER STEP IN X
  476.         IF IT IS, THEN LET A=X ┼╧╥ XOLD
  477.                        PLOT A INTO THE BUFFER
  478.                        LET XOLD=X
  479.         KEEP ON GOING UNTIL WE'RE FINISHED
  480.  
  481.         ╘HIS SIMPLE MODIFICATION GIVES US A SUBSTANTIAL SPEED INCREASE --
  482. ON THE OLD FILLED HIRES CUBE3D PROGRAM, ╔ MEASURED A GAIN OF ONE FRAME PER
  483. SECOND.  ╬OT EARTH-SHATTERING, BUT NOT BAD EITHER!  ╫HEN FACES ARE NOT
  484. FILLED, THE DIFFERENCE IS OF COURSE MUCH MORE NOTICABLE.
  485.         ╘HERE ARE A FEW THINGS TO BE CAREFUL OF.  ╘HERE WAS A BUG IN THE
  486. OLD ROUTINE WHEN THE LINE WAS A SINGLE POINT.  ╔N THAT CASE DX=DY=0, AND
  487. THE PROGRAM WOULD DRAW A VERTICAL LINE ON THE SCREEN.  ╘HERE ARE PROBABLY
  488. SOME OTHER THINGS TO BE CAREFUL OF, BUT SINCE ╔ WROTE THIS PART OF THE
  489. CODE THREE MONTHS AGO ╔ REALLY DON'T REMEMBER ANY OF THEM!
  490.         ╘HIS TAKES CARE OF HORIZONTAL LINE CHUNKS -- WHAT ABOUT VERTICAL
  491. CHUNKS?  ╫ELL, BECAUSE OF THE WAY POINTS ARE PLOTTED THERE IS NOTHING
  492. WE CAN DO ABOUT THEM.  ┬UT, AS WE SHALL SOON SEE, IF WE USE AN ┼╧╥-BUFFER
  493. TO FILL FACES WE WILL BE FORCED TO TAKE CARE OF THE VERTICAL CHUNKS!
  494.  
  495. ╟ENERAL ╨OLYGON ╥OUTINE
  496. -----------------------
  497.  
  498.         ╬OW WE CAN BEGIN THINKING ABOUT A GENERAL POLYGON ROUTINE.  ╞IRST
  499. WE NEED A LIST OF SETS OF POINTS, WHERE EACH SET CORRESPONDS TO A
  500. POLYGON.  ╘HE FIRST NUMBER IN A SET COULD BE THE NUMBER OF (X,Y,Z) POINTS
  501. IN THAT SET, AND THE POINTS COULD THEN FOLLOW.  ╙O A TRIANGLE COULD
  502. BE GIVEN BY THE DATA SET:
  503.  
  504.         3 -1 0 0 0 1 0 1 0 0
  505.  
  506. ╘HIS WOULD BE A TRIANGLE WITH VERTICES AT (-1,0,0), (0,1,0), AND (1,0,0).
  507. ╫E CAN MASH A BUNCH OF THESE SETS TOGETHER, BUT SOMEHOW WE HAVE TO KNOW
  508. WHEN WE'VE HIT THE END -- FOR THIS WE CAN USE A ZERO, SINCE WE DON'T
  509. WANT TO PLOT POLYGONS WITH ZERO POINTS IN THEM.
  510.         ╞OR THAT MATTER, HOW MANY POINTS SHOULD THERE BE IN A POLYGON?
  511. ╘HERE MUST BE AT LEAST THREE, OTHERWISE IT MAKES NO SENSE.  ╙INCE WE
  512. WANT OUR POLYGONS TO BE CLOSED, THE COMPUTER SHOULD BE SMART ENOUGH TO
  513. CONNECT THE LAST POINT TO THE FIRST POINT -- IN OUR TRIANGLE ABOVE,
  514. THE COMPUTER WOULD JOIN (-1,0,0) TO (0,1,0), (0,1,0) TO (1,0,0), AND
  515. (1,0,0) TO (-1,0,0).
  516.         ╬OW THAT WE HAVE A POLYGON, WE WANT TO ROTATE IT.  ┘OU WILL
  517. RECALL THAT WE HAVE CALCULATED A ROTATION MATRIX ═, WHICH ACTS ON
  518. POINTS.  ╙O WE NEED APPLY OUR ROTATION TRANSFORM TO EACH OF THE
  519. POINTS IN THE POLYGON, I.E. MULTIPLY ═ TIMES EACH POINT OF THE
  520. POLYGON.  ╞URTHERMORE, WE NEED TO PROJECT EACH OF THESE POINTS.
  521.         ╒H-OH: MATRIX MULTIPLICATION.  ╔N THE PAST WE HAVE AVOIDED THIS
  522. ISSUE BY PUTTING THE VERTICES OF OUR CUBE AT 1 OR -1.  ╙O WE NEED TO
  523. USE OUR MULTIPLICATION ROUTINE FROM LAST TIME.  ┬UT WAIT!  ┴S YOU RECALL,
  524. THE LAST PROGRAM USED A SPECIALLY MODIFIED MULTIPLICATION TABLE.  ╘O GET
  525. A WIDER RANGE OF NUMBERS TO MULTIPLY WE WILL NEED ANOTHER SET OF
  526. MULTIPLICATION TABLES -- NO BIG WHOOP.
  527.         ╬OW, IF YOU REVIEW THE MULTIPLICATION ROUTINE FROM LAST TIME,
  528. IT ADDS TWO NUMBERS AND SUBTRACTS TWO NUMBERS.  ╫HAT KINDS OF NUMBERS
  529. WILL WE BE DEALING WITH?  ╘HE MATRIX ELEMENTS VARY BETWEEN -64..64.
  530. ╘HIS THEN FIXES OUR RANGE OF POLYGON COORDINATES FROM -64..64.  ╫HY?
  531. ╔F THE MATRIX ELEMENT IS 64, AND WE MULTIPLY IT BY 64, THE MULTIPLICATION
  532. ROUTINE WILL ADD 64 AND 64 AND GET 128, WHICH IS RIGHT ON THE EDGE OF
  533. OUR MULTIPLICATION TABLE.
  534.         ├AN WE IMPROVE THIS ROTATION PROCESS IN ANY WAY?  ╔N FACT, WE CAN
  535. CUT DOWN ON THE NUMBER OF MULTIPLICATIONS (I.E. DO EIGHT OR EVEN SEVEN
  536. INSTEAD OF NINE MULTIPLICATIONS).  ╚OWEVER, THERE IS A FAIR AMOUNT OF
  537. OVERHEAD INVOLVED IN DOING SO, AND OUR MULTIPLY ROUTINE IS FAST ENOUGH
  538. THAT THE EXTRA OVERHEAD AND COMPLEXITY REALLY GAIN US VERY LITTLE IN ALL
  539. BUT THE MOST COMPLICATED OF POLYGONS.  ╔N OTHER WORDS, ╔ DIDN'T BOTHER.
  540.  
  541.         ╫HAT ABOUT HIDDEN FACES?  ┴GAIN, FROM LAST TIME YOU MAY RECALL
  542. THAT A METHOD WAS DESCRIBED WHICH USED THE CROSS-PRODUCT OF THE PROJECTED
  543. VECTORS.  ╚OW DO WE IMPLEMENT THIS IN THE PROGRAM?  ╫ELL, IF WE TAKE
  544. THE FIRST THREE POINTS OF THE POLYGON, WE HAVE TWO VECTORS.  ╠ET'S SAY
  545. THESE POINTS ARE ╨1 ╨2 AND ╨3.  ╘HEN ╓1=╨1-╨2 AND ╓2=╨3-╨2 ARE TWO
  546. VECTORS IN THE PLANE OF THE POLYGON WHICH ARE CONNECTED AT THE POINT ╨2
  547. (THIS ANALYSIS WILL OF COURSE ONLY WORK IF THE POLYGON LIES IN SOME PLANE).
  548. ─EPENDING ON HOW WE TAKE THE CROSS PRODUCT, THE SIGN WILL BE POSITIVE OR
  549. NEGATIVE, AND THIS WILL TELL US IF THE POLYGON IS VISIBLE.
  550.         ─EPENDING ON HOW WE TAKE THE CROSS PRODUCT?  ┴BSOLUTELY.
  551. V1 X V2 = -V2 X V1.  ╫HAT IT REALLY BOILS DOWN TO IS HOW YOU DEFINE THE
  552. POINTS IN YOUR POLYGON.  ╙PECIFICALLY, WHAT ORDER THEY ARE IN.  ╨OINTS
  553. THAT ARE SPECIFIED IN A CLOCKWISE MANNER WILL GIVE A FACE POINTING IN
  554. THE OPPOSITE DIRECTION OF A POLYGON WITH THE SAME POINTS SPECIFIED IN
  555. A COUNTER-CLOCKWISE ORDER.  ╔N MY PROGRAM, THE POLYGONS MUST BE ENTERED
  556. IN COUNTER-CLOCKWISE ORDER (WITH YOU FACING THE POLYGON) FOR HIDDEN
  557. FACES TO WORK THE WAY YOU WANT THEM TO ;-).
  558.  
  559.         ╧NE OTHER NEAT THING TO HAVE IS THE ABILITY TO ZOOM IN AND OUT.
  560. ╫E KNOW FROM THE VERY FIRST ARTICLE THAT ZOOMING CORRESPONDS TO MULTIPLYING
  561. THE PROJECTED POINTS BY A NUMBER, SO THAT'S WHAT WE'LL DO.  ╘HE MULTIPLICATION
  562. ROUTINE RETURNS ┴=┴*┘/64, SO A ZOOM FACTOR OF 64 WOULD BE LIKE MULTIPLYING
  563. THE POINT BY ONE.  ┴LL THE PROGRAM DOES IS MULTIPLY THE PROJECTED POINTS
  564. BY A NUMBER ZOOM, UNLESS ZOOM=64, IN WHICH CASE THE PROGRAM SKIPS THE
  565. ZOOM MULTIPLY.  ┬E WARNED!  ╬O CHECKS OF ANY SORT ARE MADE IN THE PROGRAM,
  566. SO YOU CAN ZOOM AT YOUR OWN RISK!
  567.  
  568.         ╘HE IMPORTANT THINGS TO REMEMBER ARE: WHEN ENTERING POLYGONS,
  569. MAKE SURE THE NUMBERS RANGE FROM -64 TO 64, AND THAT YOU ENTER POINTS
  570. IN COUNTERCLOCKWISE.  ╧UR TRIANGLE EXAMPLE ABOVE REALLY SHOULD HAVE BEEN
  571. ENTERED AS, SAY,
  572.  
  573.         3 -64 0 0 64 0 0 0 64 0
  574.  
  575. ╞ILLED ╞ACES -- ╒SING AN ┼╧╥ BUFFER
  576. -----------------------------------
  577.  
  578.         ╫ELL WE STILL HAVE ONE THING LEFT, WHICH WAS ALLUDED TO IN THE
  579. PREVIOUS ARTICLE: USING ┼╧╥ TO MAKE A FILLED FACE.  ╙OME POSSIBLE
  580. DIFFICULTIES WERE RAISED, BUT WHEN YOU PLOT A SINGLE POLYGON AT A
  581. TIME, THE PROBLEM BECOMES VASTLY SIMPLIFIED.
  582.         ╞IRST ╔ SHOULD PERHAPS REMIND YOU WHAT EXCLUSIVE-OR IS: EITHER
  583. ┴ OR ┬, BUT NOT BOTH.  ╙O 1 ┼╧╥ 0 = 1, AS DOES 0 ┼╧╥ 1, BUT 0 ┼╧╥ 0 = 0
  584. AND 1 ┼╧╥ 1 = 0.  ┴S A SIMPLE INTRODUCTION TO USING THIS FOR FILLING
  585. FACES, CONSIDER THE FOLLOWING PIECE OF THE DRAWING BUFFER:
  586.  
  587.         00001011 ═1
  588.         00000000 ═2
  589.         00000001 ═3
  590.         00001010 ═4
  591.  
  592. ╠ETS SAY WE MOVE DOWN MEMORY, ┼╧╥ING AS WE GO.  ╠ET ═2 = ═1 ┼╧╥ ═2.  ╘HEN
  593. LET ═3 = ═2 ┼╧╥ ═3.  ╘HEN LET ═4 = ═3 ┼╧╥ ═4.  ╧UR LITTLE PIECE OF MEMORY
  594. IS NOW:
  595.  
  596.         00001011 ═1
  597.         00001011 ═2
  598.         00001010 ═3
  599.         00000000 ═4
  600.  
  601. ╫HAT JUST HAPPENED?  ╔MAGINE THAT THE ORIGINAL MEMORY WAS A SERIES OF
  602. PIECES OF LINE SEGMENTS.  ╫E HAVE JUST FILLED IN THE AREA BETWEEN THE
  603. TWO LINE SEGMENTS, LIKE MAGIC!
  604.         ╔F YOU STILL AREN'T GETTING IT, DRAW A LARGE SECTION OF MEMORY,
  605. AND THEN DRAW AN OBJECT IN IT, LIKE A TRIANGLE, OR A TRAPAZOID, AND
  606. ┼╧╥ THE MEMORY BY HAND, STARTING FROM THE TOP AND MOVING DOWNWARDS.
  607.         ┼╧╥ FLIPS BITS.  ╔F YOU START WITH A ZERO, IT STAYS ZERO UNTIL
  608. IT HITS A ONE.  ╔T WILL THEN STAY ONE UNTIL IT HITS ANOTHER ONE.  ╙O
  609. YOU CAN SEE THAT IF YOU HAVE AN OBJECT BOUNDED BY ONES, ┼╧╥ING
  610. SUCCESSIVE MEMORY LOCATIONS WILL AUTOMAGICALLY FILL THE OBJECT.
  611.         ╥IGHT?  ╫ELL, WE HAVE TO BE CAREFUL.  ╧NE MAJOR PROBLEM IS
  612. A VERTICAL LINE:
  613.  
  614.         1                       1
  615.         1       GOES TO         0
  616.         1                       1
  617.         1                       0
  618.  
  619. ╬OT ONLY IS THE RESULTANT LINE DASHED, BUT IF THERE ARE AN ODD NUMBER OF
  620. POINTS IN THE LINE SEGMENT, THE LAST ONE WILL HAPPILY MOVE DOWNWARDS IN
  621. MEMORY, AND GIVE YOU A MUCH LONGER VERTICAL LINE THAN YOU EXPECTED!  ╙INCE
  622. ANY LINE WITH SLOPE GREATER THAN ONE IS MADE UP OF A SERIES OF LINE
  623. SEGMENTS, THIS IS A MAJOR CONSIDERATION.
  624.         ┴NOTHER PROBLEM ARISES WITH SINGLE POINTS: A ONE JUST SITTING ALL
  625. BY ITSELF WILL ALSO GENERATE A NICE STREAK DOWN YOUR DRAWING AREA.
  626.         ╔F YOU THINK ABOUT IT, WHAT WE IDEALLY WANT TO HAVE IS AN OBJECT
  627. THAT AT ANY GIVEN VALUE OF X THERE ARE EXACTLY TWO POINTS, ONE DEFINING
  628. THE TOP OF THE OBJECT, AND THE OTHER DEFINING THE BOTTOM.  ╘HIS GIVES US
  629. THE INSIGHT TO SOLVE THE ABOVE TWO PROBLEMS.
  630.         ╞IRST LET'S THINK ABOUT VERTICAL LINES.  ╔N PRINCIPLE WE COULD
  631. PLOT THE FIRST AND LAST ENDPOINTS OF EACH VERTICAL LINE CHUNK, BUT THAT
  632. IS EXACTLY WHAT WE DON'T WANT!  ╥EMEMBER THAT THESE ARE CLOSED POLYGONS,
  633. WHICH MEANS THAT THERE ARE _TWO_ LINES WE NEED TO THINK ABOUT.  ╔F ╔
  634. PLOT JUST A SINGLE POINT IN EACH VERTICAL LINE SEGMENT, THERE MUST
  635. BE ANOTHER POINT SOMEHWERE, EITHER ABOVE OR BELOW IT, FROM ANOTHER
  636. LINE SEGMENT, WHICH WILL CLOSE THE POINT TO ┼╧╥-FILLING.  ╥EMEMBER, WE
  637. WANT EXACTLY TWO POINTS AT EACH VALUE OF X: ONE WILL COME FROM THE
  638. LINE, AND THE OTHER WILL COME FROM THE OTHER LINE WHICH MUST LIE ABOVE
  639. OR BELOW THE CURRENT ONE.
  640.         ╞URTHERMORE, WITH ANY CONVEX POLYGON THERE ARE EXACTLY TWO
  641. LINES WHICH COME TOGETHER AT EACH VERTEX OF THE POLYGON.  ╘HIS MEANS
  642. THAT THERE ARE ONLY CERTAIN CASES WHICH WE NEED TO WORRY ABOUT.
  643. ╞OR INSTANCE, TWO LINES MIGHT JOIN IN ANY OF THE FOLLOWING WAYS:
  644.  
  645.         \                  /    \    /
  646.          \                /      \  /
  647.           \_____    _____/        \/  ETC.
  648.  
  649. ╔F YOU DRAW OUT THE DIFFERENT CASES INVOLVING VERTICAL LINES, YOU CAN SEE
  650. THAT YOU HAVE TO BE CAREFUL ABOUT PLOTTING THE LINES.  ╧NE TRICKY ONE
  651. IS WHERE TWO VERTICAL LINES WITH DIFFERENT SLOPES OVERLAP AT THE POINT
  652. OF INTERSECTION.
  653.         ╙O AFTER STARING AT THESE PICTURES FOR A WHILE, YOU CAN FIND
  654. A CONSISTENT METHOD WHICH SOLVES THESE DIFFICULTIES.  ┴S LONG AS YOU
  655. FOLLOW THE FOLLOWING RULES, THE PROBLEMS ALL DISAPPEAR; THE LINE ROUTINE
  656. NEEDS TO BE MODIFIED SLIGHTLY:
  657.  
  658.         1) ╫HEN PLOTTING A VERTICAL LINE (I.E. BIG STEPS IN ┘ DIRECTION),
  659.            DON'T PLOT THE ENDPOINTS (I.E. X1,Y1 AND X2,Y2).
  660.         2) ╫HEN PLOTTING A VERTICAL LINE, CONSISTENTLY PLOT EITHER THE
  661.            FIRST PART OF EACH CHUNK OR THE LAST PART OF EACH CHUNK
  662.            (EXCLUDING THE ENDPOINTS OF COURSE).  ╔N OTHER WORDS, ONLY
  663.            PLOT A POINT WHEN YOU TAKE A STEP IN X, AND THEN PLOT ONE
  664.            AND ONLY ONE POINT.
  665.  
  666. ╬OW ╔ DEDUCED THESE BY STARING AT PICTURES FOR A FEW HOURS AND TRYING
  667. DIFFERENT THINGS LIKE TOP/BOTTOM OF CHUNK, LEFT/RIGHT, FIRST/LAST, ETC.
  668. ┘OU CAN SEE THAT IN SOME CASES THIS ENSURES THAT ONLY ONE POINT APPEARS
  669. ON A GIVEN LINE SEGMENT.  ┬UT TO ME THE ONLY WAY TO CONVINCE YOURSELF
  670. THAT THIS REALLY DOES WORK IS TO DRAW A BUNCH OF PICTURES, AND TRY IT
  671. OUT!  ┘OU HAVE CASES WHERE TWO VERTICAL LINES INTERSECT, AND WHERE
  672. A VERTICAL LINE INTERSECTS A HORIZONTAL LINE.
  673.         ┬UT THERE IS STILL ONE THING WHICH WE HAVE FORGOTTEN -- THE
  674. CASE OF A SINGLE POINT.  ╘HIS CAN HAPPEN IN, FOR INSTANCE, A POINTY
  675. TRIANGLE, POINTING IN THE X-DIRECTION.  ╚OW DO WE FIX THIS?  ┬Y
  676. SIMPLY AVOIDING THE POINT: IN THE LINE DRAWING ROUTINE, USE ┼╧╥
  677. TO PLOT THE POINTS INSTEAD OF ╧╥┴.  ╙INCE VERTICAL LINES SKIP THE
  678. ENDPOINTS, VERTICAL-HORIZONTAL INTERSECTIONS ARE ╧╦.  ╚ORIZONTAL-
  679. HORIZONTAL INTERSECTIONS WILL FORCE THE POINT OF INTERSECTION TO
  680. BE ZERO.
  681.         ╒H-OH, WHAT ABOUT INTERSECTIONS LIKE -----*------.  ╤UITE FRANKLY
  682. ╔ JUST THOUGHT OF IT, AND ╔ THINK MY PROGRAM WILL FAIL ON INTERSECTIONS
  683. LIKE THESE.  ─RAT.  ╫ELL, THAT JUST GIVES US SOMETHING FOR NEXT TIME!
  684.         ╧NE OTHER THING NEEDS TO BE MENTIONED: FOR ┼╧╥-FILLING TO BE USEFUL
  685. YOU NEED TO DRAW THE POLYGON IN A SPECIAL BUFFER, AND THEN ┼╧╥ THIS BUFFER
  686. INTO THE MAIN DISPLAY BUFFER.  ╔F YOU TRY TO ┼╧╥ THE DISPLAY BUFFER DIRECTLY
  687. YOU ARE GOING TO HAVE A WHOLE HEAP OF TROUBLE, SUCH AS THE CONCERNS RAISED
  688. LAST TIME.
  689.         ╞INALLY, THIS GIVES A SIMPLE WAY OF FILLING WITH PATTERNS INSTEAD
  690. OF BORING MONOCOLOR.  ╔NSTEAD OF ┼╧╥ (┼╧╥┬╒╞),┘ : ╧╥┴ (─╥┴╫┬╒╞),┘ YOU CAN
  691. USE ┼╧╥ (┼╧╥┬╒╞),┘ : ┴╬─ ╨┴╘╘┼╥╬,┘ : ╧╥┴ (─╥┴╫┬╒╞),┘ (AS LONG AS YOU
  692. PRESERVE THE ORIGINAL ┼╧╥ (┼╧╥┬╒╞),┘).
  693.  
  694.         ╫ELL ╔ AM EXTREMELY TIRED AND ╔ HOPE ├RAIG HASN'T SENT OUT ├=╚ACKING
  695. WITHOUT ME!  ╔ HOPE YOU HAVE FUN PLAYING WITH THE PROGRAM, AND ╔ WOULD BE
  696. VERY INTERESTED IN SEEING ANY NEAT GEOMETRIC SHAPES YOU MIGHT DESIGN!
  697.  
  698. ╨ROGRAM NOTES:
  699. --------------
  700.  
  701.         - ╚IDDEN FACES DEFAULTS TO "ON".  ╔F YOU ENTER A SHAPE AND A BLACK
  702.           SCREEN COMES UP, HIT 'H' TO TURN OFF HIDDEN FACES (YOU PROBABLY
  703.           ENTERED THE POLYGON CLOCKWISE).
  704.         - ╘HERE IS NO PATTERN FILLING -- JUST SIMPLE ┼╧╥ WITH A TWIST:
  705.           THE ┼╧╥ BUFFER IS ┼╧╥'D INTO THE DRAWING BUFFER.
  706.         - ┘OU MIGHT START HOSING MEMORY IF YOU ZOOM TOO LARGE.
  707.  
  708. ╙╠╩ 6/15/95
  709.  
  710. ┴DDENDUM
  711. --------
  712. ╙TEPHEN ╩UDD SJUDD@NWU.EDU
  713.  
  714.         ╠AST TIME WE PUT A CIRCLE INTO THE 2─ GRAPHICS TOOLBOX.  ├HRIS
  715. ═C┬RIDE HAS POINTED SOMETHING OUT TO ME ABOUT THE ALGORITHM, WHICH MAKES
  716. IT COMPLETE.  ┴S YOU MAY RECALL, THE ALGORITHM GAVE A VERY SQUARISH
  717. CIRCLE FOR SMALL RADII.  ├HRIS TOLD ME THAT SETTING THE INITIAL COUNTER
  718. VALUE TO ╥/2, INSTEAD OF ╥, GAVE A PERFECT CIRCLE.  ╫HAT IS GOING ON?
  719. ╔F YOU RECALL THE ALGORITHM, WE ARE COMPUTING A FRACTIONAL QUANTITY,
  720. AND WHEN THAT QUANTITY BECOMES LARGER THAN ONE, WE DECREASE ╪.  ╫OULDN'T
  721. IT BE A WHOLE LOT SMARTER TO ROUND OFF THAT FRACTION INSTEAD OF
  722. TRUNCATE IT?  ╧F COURSE IT WOULD, AND THAT IS WHAT STARTING THE COUNTER
  723. AT ╥/2 DOES.
  724.         ╙O, TO UPDATE THE PREVIOUS ALGORITHM, ┴ SHOULD BE INITIALIZED TO
  725. ╥/2 INSTEAD OF ╥, WHICH MEANS THAT WE CHANGE
  726.  
  727.         ╠─┴ ╥
  728.  
  729. TO
  730.  
  731.         ╠─┴ ╥
  732.         ╠╙╥
  733.  
  734. FOR A PERFECT CIRCLE EVERY TIME.
  735.  
  736. BEGIN 666 CUBE3D3.2.S
  737. ═ ' ╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*@╘╩╚*"@╚*"@╚*"@
  738. ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚'-415!(14┌@:┼5$1*"@╚*"@╚*"@
  739. ═╚*"@╚*"@╚*"@*@╘╩╚&=%3╒)'1:!╘05┼,3╒*@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩
  740. ═╚'-405)4140┌╚#<╧,3$╧.32@╚*"@╚*"@╚*"@╚*"@*@╘╩╚&9)3─┼32$5$.╩ ╫
  741. ═+╙$┘+╙─╘╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╥+├"@8╘]-4$╤%5$5$.╩ ╤,┬\╤-╥\┘
  742. ═-*"@╚*"@*@╘╩╚%8╙+├"@8╘]-4$╤%5$5$.╩ ╙+╙(╨+╙─╒╚*"@╚*"@*@╘╩╚%8╙
  743. ═+├&@8╘]-4$╤%5$5$.╩ ╓+╙$╘+╙─╒╚*"@╚*"@*@╘╩╚%8╙+├*@8╘]-4$╤%5$5$
  744. ═.╩ ╓+╙$╒+╙─╒╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
  745. ═╚*"@*@╘╩╚'=%3$╨╠╚$┼&╚$%,3*!'3╘53╚%=%3$╥@5$┴)4┌"@*@╘╩╚%!23╘=2
  746. ═04╓@5╘┼,3*!23╒1!5$6@0:!#54)%+╩"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
  747. ═╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╥+├"@*┌!╬15>@04┘$╚&┼-4%)/5─5$(:"@╚*"@
  748. ═*@╘╩╚&┘/5┌!7251(╚$9!4╒1%4╩!23╒5424┘%4╥╥@╚*"@*@╘╩╚$┴)1$1%3╩!3
  749. ═55)&04-%4╥╥@1─┼,3$5$╚*"@╚*"@*@╘╩╚$9!0╘53+*!!3─2@15┴44─&@5$]0
  750. ═╚%-%0╒)%5*"@*@╘╩╚%1%6%2@34534╘%'15,┴╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩
  751. ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╙+├"@*┌!╞05-4
  752. ═╚$-(54┘+6:!,24┘%╚*"@╚*"@*@╘╩╚%)/551)3─4╬╚*"@╚*"@╚*"@╚*"@╚*"@
  753. ═╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╙
  754. ═+├&@*┌!╟14┘%4─%,╚%!/3%┼'3╘┌@4$╤/5*"@*@╘╩╚%=)5$┬@2$┼$1$5.╚$9!
  755. ═0╘53╚"┴╪+5!23╘150╒0╔*@╘╩╚$%.1*!:3╘]-╚$9%05154─4╬╚*"@╚*"@╚*"@
  756. ═╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╙+├*@
  757. ═*┌!┼;╫(═0┼5&1─52╚$9)3$╤)3─>@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
  758. ═╚*"@╚*"@╚*"@╚*"@*@╘╩╚'1(25.@4%)/1╒)!3:!)4┌!)3┼1%3─1%1*!43┌"@
  759. ═*@╘╩╚$%#0╘]-4$%.6:!42$6@05)424-,1:!)3╩"@╚*"@*@╘╩╚&,]:$%#2╘┼.
  760. ═1╥╥@:┼5.+╩ ┘-:!)4╒-512┌@╚*"@*@╘╩╚&9/4╩!$151!24╤3╚$].╚%1(25.@
  761. ═4%)/1╒)!32╥@*@╘╩╚%)%042@5$┴%╚$%25$┼#3$4┴╚*"@╚*"@╚*"@╚*"@*@╘╩
  762. ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚'=2251%╚%1/╚%53
  763. ═(:"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
  764. ═╚*"@╚*"@*@╘╩╚&╒94╘5,1╩!72$5.╚%┼/54┘'╚$1)1*"@╚*"@╚*"@*@╘╩╚$5!
  765. ═1╘523%╞@1┼)%455%3┼2@╚*"@╚*"@╚*"@╚*"@*@╘╩╚&1/0╒1/4╩!!3─2@<╘%)
  766. ═3┼0╠╚$%.1*!(14%21*"@*@╘╩╚$=214%4╚&%21╒5-14┘4╚*"@╚*"@╚*"@╚*"@
  767. ═╚*"@*@╘╩╚*!┴0─]55*!)5*!!3─2@04)/550┌╚$)55*"@╚*"@*@╘╩╚*!%5─52
  768. ═34]21:"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚&-!346@3╒54╚$)9╚%1(1:!3
  769. ═04╒%╚&1/3╒*@╚*"@*@╘╩╚$%3╚$┼.╚&╞@5╘5.5"┌@╚*"@╚*"@╚*"@╚*"@╚*"@
  770. ═*@╘╩╚*"@╚"╓@<┼5"04┼9052@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@
  771. ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚'1(3╒5'2*!╔╚%-014%+╚%=)5$┬@
  772. ═5$┴%╚*"@╚*"@*@╘╩╚%1/3─=515.@3╘:@345.╚$%.1*!/1╩!!3─=,15.@*@╘╩
  773. ═╚$%.1*!(059%╚$┘/5*!,3╒9%+*!╔╚$%-╚*"@╚*"@*@╘╩╚$)%0╘]-1:!!4┌!3
  774. ═3╒5.1$┼.1┌!"4─%34╥╥@3╒*@*@╘╩╚$&@5$┼.2╘╤)3─>@0╒┼-0─%,+╩"@╚*"@
  775. ═╚*"@╚*"@*@╘╩╚*"@╚"╓@,:!├3╒))3┼1(24%.4┌ ╤,┌"@╚*"@╚*"@*@╘╩╚*"@
  776. ═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚' ╬<╥┌@=$┴)4┌!705.@
  777. ═5╒))5%1%3╩!54╘┼.1┌"@*@╘╩╚*"@╚*"@;4523$┼.╚#$╥."┌@╚*"@╚*"@╚*"@
  778. ═╚*"@*@╘╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*@╘-(&]╥9╥ ─
  779. ═.# ╨, ╘-*╩!├3╘┘35$%.5%,-#6)╒9╞8╤(&5╤=2 ─,╙ ╨," [9─┼24╒2@0╘┴!
  780. ═4─%#5$52╚%-%5 ╒┬=69╞,┬!┼<74@)#,╪,# @.╫-%0╘].1*!#2$%204-415*@
  781. ═4╘54#65╧<╞)╒9┬!┼<74@)#0╨,# @.╓5╧<┬╒"549&15(-8╟5╞9╞5╥(&5╤=2 ─
  782. ═83,@.╫!215-534%"3%╞@5$┴%╚%1!4$6@5╘].)╒2@0─6@4┼5.3─┼.1╨╒╪,2!┼
  783. ═<74@)&9┬(#═╨3╘┼.5%.@1─]2╚$1205=)3─>@0:!,24┘%#7─╤(&5╤=2 ─9╞,@
  784. ═.╫1(15-%╚%╔%4─^@4$%'1:!!1$1215-315,->#(@97%╒("1╞9" [1$].)╒2@
  785. ═0╘].1─╤)0╒2@5╘┼42*!┬87-╔8╨╒┘,┬!┼<74@)&9┼#6]╠9'@@97%╒("1╞9 ╒├
  786. ═:'5╬:╥!┼<74@)&9┼#61╪(&5╤=2 ─-├<@.╫1(25.@25.@4╘┴!4─5$╚%=)5$┬@
  787. ═=#&@0─5,3╒<-9'─@97%╒("0╓. ╒╘96╒╨,2!┼<74@)&9┬(#═╧1╩!#3╒524╘4╠
  788. ═╚$-/54╤$╚$-/3─9,24-4╚%=)5$┬@6#$-=&5═<#(@97%╒("1╞8╥ [=$5-4$]2
  789. ═05)9╚%9!4─┼!0─╤%4╨╒┌=&5═<"!┼<74@)# ╥(#═╒4╘5$╚$9/4╩!"549&15*@
  790. ═4╒=!4"┌@╚&1/3┬=4╚%1/54-(+@╒┌,2!┼<74@)#(╥(#═╒4╘5$╚$)9╚$╒!5$┬@
  791. ═4─]55$┼.10╒┌,┬!┼<74@)#(╘(#═─3╘╪╟5*!43╒5#2*!42$531:!%251(15(┴
  792. ═#7╚╙(&5╤=2 ─,├8->├0@97%╒("0╥. ╒╦(&5╤=2 ─8├8@.╓-/3┼-404┘4╚%53
  793. ═142@1─]2╚$┴)1$1%3@╘@(" [4╒521─%#1:!$151%0╒1)3╘┌@+:!$3╘╪╟5*!4
  794. ═3╒5#2 ╒╚:61┼(&5╤=2 ─8├4@.╓%21:!355)&04-%4┌!(241$14╪_#69╔;&╨@
  795. ═97%╒("0╒," [85)%╚%=%╚%5324┘'╚&5╧<┬╒&24╤,/╨╒┴;╞=═87@@97%╒(#$╥
  796. ═," [=$┴%4─6@05)%╚#(╩4$─╧04┘'34%8╚$%.1╘╤%4╨╘-*╩!╓:6,-#79═8╫-┬
  797. ═(&5╤=2 ─9# ╤. ╒┬:╓=╬9"!┼<74@)&0╨,├ -8╞]╥9&5╥(&5╤=2 ─9# ╥,0╒╙
  798. ═<╫1┴<╟0@97%╒(#$╙-#0@.╒)/5┌ ┘╚$┼.╚%-#4─5%3╩!-14╒/4┼╞@052@,3 ╥
  799. ═- ╘-#2╩@:╘523─%,#0╒├:')╧=70@97%╒("1╞9╞0╥#6=┼=&┼╬(&5╤=2 ─9╞9┼
  800. ═- ╘-*╩!╙3╘╒%╚%9!4─┼!0─╤%4╨╘-9╓╤╧8╟┴═:6╪@/2 ─,╓8@.╫1(15-%╚$%2
  801. ═1:!54╘5$╚$┼.╚$-,14%224┘'╚%1(10╒╟;&]┬>&╒┴>" ]("0╘," [1%)!5╘┼.
  802. ═1┌ ╚1╘╤/0─%,*:!"549&15(-9╓╤╧8╟┼═:6╪@/2 ─-#$-9╓╤╧8╟┼═87@@/2 ─
  803. ═-#(-;&]├>&╒╔;┬ ]("0╒-╥ [=$┴%4╘6@05)%╚%53142@24┌@0╘╤%05))3─>@
  804. ═5$┴%#6╤╧8╫┴═87@@/2 ─-3@@.╓5╧<╩ ╚3$]#04╨╔╚$)51─9%4@╒╠;╓-┘;6┼╬
  805. ═(#╘@)#4┘#6╤╧8╫┼═87@@/2 ─-├ -<#%╪(#╘@)#─╥(#═╘2$531:!!4─6@5$5-
  806. ═4$]205)9╚%-43╒)!1╘4-<#%┘(#╘@)#─╙(#═╒4╘5$╚$┼.╚%!,3╒1424┘'╚%1(
  807. ═1:!04─]*14-424].#7 ╤>┬ ]("0┘- ╒╨,╟@@/2 ─.34@.╫1(15╞@05)%╚$┴%
  808. ═4─6@4╘^@5$┴!5*!710╒╨,╟─@/2 ─.38@.╘1/3┬=4╚$┴!5─6@5$^@4─5#04╤#
  809. ═54╤!5$6@5$┴%32╪-<#)┌(#╘@)&%┼#7 ╙>" ]("1┴9┬ [=$┴%6:!-04═%╚$╤)
  810. ═1─6@14%362╪-<#-┘(#╘@)&(╨#7 ╙>┬ ]("1┬,2 [=╘┴9╚$%21:!93╒6@3$]/
  811. ═2╘┼.1┌!!5*!-1:!,24═%╚%1(050_#7 ╤=" ]("1┬,┬ [9$].)╒2@64]5╚%12
  812. ═55-4╚$╒%/╨╒╨,╟0@/2 ─8├,-<#-╘(#╘@)&(╘(#═╚059)3─>@04┘/5$┴%4╩!#
  813. ═2$┼,1*!705-.)╒2@35╞@241%02╪-:6┘─97@@/2 ─-3$-8╓]╒;╟1╨=',@/2 ─
  814. ═-3(->╞]╧;2 ]("0╫,2 [>─]/3:!&04-43╒(-9'-╪(#╘@)#8╤(#═─<╫┬@25.@
  815. ═5$┴%╚$┼.0╒)%345.5*!&3╒(-(" @.╒)/5$%424┘'╚$%23╒5.1*!8#61╙>2 ]
  816. ═("0╓,┬ [<╘┼-24╤!4╩!&3╒*@9'-┘+*!─<╫╚-9'-┌(#╘@)#8╙#7-╪(#╘@)#8╘
  817. ═(#═╘2$531:!!4─6@5$┴%╚$%#5%5!3*!!3─=,15.@24┌@6*!9╚$%.1*!:#7-┘
  818. ═(#╘@)#8╒#7-┌(#╘@)#8╓#70╤(#╘@)#8╫(#═╘2$531:!!4─6@55-%1*!)3╩!4
  819. ═2$6@4─]4051)3╘╪-=#(@/2 ─-├@-=#,@/2 ─-├─@.╫-%1:!42$6@05)424-,
  820. ═1:!&3╒*@34]21:!$151!24╤3#70╘(#╘@)#9┴#70╒(#╘@)#9┬#70╓(#╘@)#9├
  821. ═#70╫(#╘@)#9─#70╪(#╘@)#9┼#70┘(#╘@)#9╞#70╤," ]("0╫, ╒┴,3$@/2 ─
  822. ═834@.╫1(15-%╚$%21:!42$6@14╤%345.5%.@3╘:@5$┴%╚%)/5$%424].╚$╒!
  823. ═5%))6 ╒┬,3(@/2 ─838@.╫┴┘>@╒├,3,@/2 ─83<-9#(╤(#╘@)&$╪(#═╘2$6@
  824. ═3┼5-0─52╚$1%3─]415.@*%)/5╥╤#3╘╤534╪╔#64╥,┬ ]("1┴.0╒╞,├,@/2 ─
  825. ═86$-9╙,╤(#╘@)&%┬#6@╙,┬ ]("1┴8╨╒╔,╙,@/2 ─860-#0╘╩*┬╩@;4%#4─]3
  826. ═#0╒═;╫9┼(&╒┴8╨╘@;&1┴(%╘╤#2!╙=&$@73(-(#╨\/ ╘-9╓5╘:╓5┘(&╒┴8╥ @
  827. ═.╫=!252@1─]2╚$&@2╘594%)%4╒,-=╓%╔="!╩<╫(@9╓5╘:6╪-(&-═<" ├,# -
  828. ═(&)┼<2!╫86┼╘#2 \/#╨-#61┼8╟5╟(&╒┴8╥ @.╫!224┘4╚$&@0╘┴!4─%#5$52
  829. ═#2!─;┌ ╨╚* [9$].)╒2@05-314╒"3$4-#2!╠9&&@(╒╘╤#2!╩<╫*@8╓┴╥;╫5╘
  830. ═#2!├;&─-(#╪^/┬!╟971╦97─@.╓%.1*!704┼4╚%1/╚$-/3┼1)3┼5%#2!├;7 @
  831. ═(╥=3)╥ [;5╞@4╘5#4─5#5*!35╘┼40╘┬@2╘59#2!┬;╞4@;#$-(&╔╙<┬!├;&5┴
  832. ═;╟5╨#2!╩;7 @9&]╬90╒╠,2!├;7 @(╥=8)╥ [;5╞@4╘5#4─54╚$%"3╒)4╚$═%
  833. ═60╘@8╞┘┼(&1╧;╞4-(&╔═<"!├;&5┴;╟5╨#2!╞:6╪-9&]╬92 \/#╨-#61┼8╟5╟
  834. ═82!═86,-(&1╧╚# -(&╤─82!=,0╘@<╫1┴(#$╨,├0-(&9╔;@╒─;╓┘┼82 \/#╨-
  835. ═#2╚═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═#0╘@;&1┴(",─,# -
  836. ═('-╘82!┬:╓=╬9 ╘@<╫1┴(&)╧<╞1┼<@╘@;&1┴('9═8╫-┬#2!┴;╞0@(╥4╨,# ╨
  837. ═,3$╤,2 [<╘-2145.╚$╒%34]26:!43┌ ╤,#(╘#2!╧<╞$@(╥4╨,# ╤,# ╨, ╘@
  838. ═<╫1┴('9═8╫-┬#0╘@;&1┘(",╨, ╘@;&1┴(",\='1┼>'0-('-╘82!╘96╒╨,0╘@
  839. ═;&1┴(",^='1┼>'0-('-╘82!╘96╒╨,@╘@:╞╒╨('1╔=&╤┼#71╘97┴╘(&┴┼>" ┘
  840. ═,╙ ╒,3$╤,3$╤(#═#3$5!4╩!30╒)%14╪╠╚%=(251%+*!#4┼-2╚$1.#2!╘>'0@
  841. ═)┌"@╚*"@╚*"@╚*"@╚*!#54)%,╘2@5├,╬,┬<╠,$0╠,$0-('1╪=" ╟╚*"@╚*"@
  842. ═╚*"@╚*"@╚*"@╚*"@0┼─╟+#!$#2!╚97@@.68@.╘-904╪-('1╪=" ╟╚*"@╚%-4
  843. ═15!(14┌@2┼5$1"<-(&┴┼>" ┘.0╘@='┴╘(">@╚*"@1╘5/4─=%╚%1!64╤/4┬<╠
  844. ═,$0╠,$0-(&┴┼>" ┘8@╘@='┴╘(">@╚$-(14-+╚$]55*!42$6@2─%.+╩ ┘-:!)
  845. ═4╒-51:!/1┬<╠,$0-(&┴┼>" ┘-@╘@='┴╘(">@╚$,]2$%#2╘┼.1╥<-(&┴┼>" ┘
  846. ═8@╘@='┴╘(">@1─]2╚$╒/4─6@1$5404┼,4╥$╟+#!$#2!╚97@@,&0╤9#%─.64╤
  847. ═,@╘@='┴╘("=&,2]&,┬<╠.3(-('1╪=" ╟╚"╓@24┘#+╘1%0┌!8+5)/5$%424].
  848. ═)╥╨╨1 ╘@:&5╪(#%─,60╤,@╘@='┴╘("=&,╥]&-"<╠.3(-('1╪=" ╟╚"╓@24┘#
  849. ═+╘1%0┌!9+5)/5$%424].)╥╨╨1 ╘@:&5╪(#%─,60╤,@╘@='┴╘("=&-2]&-┬<╠
  850. ═.3(-('1╪=" ╟╚"╓@24┘#+╘1%0┌!:+5)/5$%424].)╥╨╨1 ╘@:&5╪(#%─,60╤
  851. ═,@╘@='┴╘(">@1├>@╚"<╠.3(-('1╪=" ╟╚"╓@4─53150╟+#!$#2!╚97@@,60╤
  852. ═9#$╥#2!╘>'0@)┌ ╦+╥╓@)╥╨┘,@╘@='┴╘(">@+:!:3╘]-╚$┼.+╘]55"<╠,$0-
  853. ═(&┴┼>" ╤9#%─,3(-('1╪=" ╟╚*!(╚* ╟+#─╥#2!╘>'0@)┌ ═╚%1/1╘=,1:!(
  854. ═241$14┌@4╒521─%#15,╟+#!$#2!╚97@@,60╤9#$╥#2!╘>'0@)╒-004-%)╥╨┘
  855. ═,@╘@='┴╘(">@+:!43╘='3$6@4╒521─%#1:!&24╤,24┘')╥╨╨1"╨╨1 ╘@='┴╘
  856. ═(">@╚%!215-3╚%&@5$^@455)5"<╠,$0-(&┴┼>" ╨9# ╒#2!╘>'0@)┌"@╚*"@
  857. ═╚%!215-3╚$%.6:!+15╞@5$^@0─5'24╪╟+#!$#2!╚97@@,# -=&┼╘;&4@;&1┴
  858. ═("┴╘96╒╨,2─╠>0╘@8╞5╤(#╔├;╓┘╘#2!╩<╫(@8╓┴╥;╫5╘#2!╔;╟─-(&)╬92!╘
  859. ═:71╠90╘@:6┘├('1┼;7 ╥#2!╩;7 @=&┼╘;&4-.╞-╧;╟0@/├╪^(&=┼=&═┼>0╘-
  860. ═*┬╚╩*╩!╙152@55"@5$%"3$53*#\╔#0╘╩╚'1!0─╤%4┌!!4─6@0╒524─5.5$╤9
  861. ═╚%-%5*!54*!)3╩!┬87-╔8╨╘╩╚$%.1*!"6:!42$6@05-314╒"3$52+@╘-=&%┬
  862. ═;&5╙(&╤─82 ├/╟1═871╚,0╘@<╫1┴('╚╤*╙$-('-╘82!┌,┬╠╤#2!╠9&$@(╙┘╘
  863. ═;6%╘:#(-('-╘82!┌,╥╠╤#2!╙=&$@>├0╦,0╘-*┬╚╩*╩!├3$5!4╩!30╒)%14┌@
  864. ═04┘$╚%-%5*!54* ┬0─┼434%0(@╒╙971╒<"!╠9&$@(╥0╨,2 [=╘┴)5$4-('-╘
  865. ═82 ─9# ╥,2 [=$┴)4┌!)4┌!$3╘┘%╚%-/╚%1(052@3╘╤$15(-(&╤─82 ├,30╫
  866. ═(#═-04-(24┘%4┌!724╤,╚%-%5*!54 ╘@:╟-╥(&-╚<╞]╒= ╘@;&1┴(",─,# @
  867. ═.╘-/4┼)%0╒1,60╘@<╫1┴("1─,#(╤#2!╠9&$@(╙╤╙<╫1┴<╟0-(&%─8╥ ├,3(@
  868. ═.╫1(1:!'3╘%,╚$┼3╚%1/╚$-%3┼1%4╩!42$6@1╒)!4$┴)0╒,-('-╘82!╘96╒╨
  869. ═,2 [8╘],54╒.╚#$╥#2!╠9&$@(╙┘╙<╫1┴<╟0@.╫)/5┌ ┘#2!╙=&$@=&5═<#$╦
  870. ═,2 [<╫-╘87)╘╚%!/24┘44┌!43┌!23╒>@.0╘@;&1┴(",╨, ╘@;&1┘(",╨, ╘@
  871. ═;&1╪(",╨," [6*!724╤,╚$-/54┘4╚#$╓╚%)/5╒.@1─]2╚%53#2!├;&,-#3╔╠
  872. ═;╓]╨('-╘82 ╚=&5═<#$╔+'─-(&┼╬>0╘@861├(",╤-@╘@8╞-├(#╔╠;╓]╨#2!├
  873. ═;&,-(&╤─82!╘96╒╨,0╘@861├(",╘," [;─5%1*!43┌!!1$2@-#"@5$^@5$┴%
  874. ═╚$)!4╘6@4$])3┼1%4@╘@<╫1┴('1┼;7 ╤(#═╘3┌!*54╒0╚%1/╚%1(1:!.15┴4
  875. ═╚%)/5╨╘@;&1┴('1┼;7 ╤*╙$-(&%─8╥ ├,# @.╫1!2╘6@0╘%21:!/1╩!#05)2
  876. ═2453#2!╙=&$@=&5═<#$╦,0╘@;&1┘(",╨, ╘@:6┘╪#2!╘>&$@(#═╪╚$┼3╚$%,
  877. ═4╘^@04┌@24┘$15┬@24┘43┌!42$6@0╘┴!4─%#5$52╚$┘534)%4@╘@8╫!╪(",╤
  878. ═-@╘@8╞┘┼(#╔╠;╓]╨(#═╬145$╚%1/╚$1/╚$┼4╚#$╓╚%1)3453#0╘╩*┬╚╩╚&-,
  879. ═14%2╚$)51─9%4┼,-#2!╠9&$@(╙╤┬=69╞,0╘@<╫1┴(&)╒9╞9┼<@╘@;&1┴(",^
  880. ═8╟5╞9├$-('-╘82!┬=69╞97(╦,0╘@;&1┘(",─,# -(&╤─>" ├,├0@.╓%34╒5-
  881. ═24┘'╚$%,3*!42%)%1:!"549&15)3╚$%210╘@;&1┴(",─,# @.╘)!0╘╠═5$\═
  882. ═0─%#2╨╘┌8╞╤╧;╫ @<╫1┴("┴┬=69╞97(╔+'─-(&┼╬>0╘@8╞┘┼(#╔┬;&]╧< ╘@
  883. ═:6┘├(&)╒9╞9┼<┬╠╤#2!─97@-(&)╬92 ┌8╞╤╧;╫ -#2╚╩*┬╩@<╘54╚%50╚$)5
  884. ═1─9%4┼,-#2!╠9&$@(╙╤┬=69╞,0╘@<╫1┴(&)╒9╞9┼<@╘@;&1┴(",^8╟5╞9├$-
  885. ═('-╘82!┬=69╞97(╦,0╘@<╫1┴('╔╘96╒╨(#═:5$5-4*!724╤,╚$╒!2╘6@3$┼&
  886. ═1:!324╒03$6@1─]2╚%53#2!╠9&$@=╞╒├<╓(-(&%╬9" ├)3$╤,3$╨,# ╤(#═╙
  887. ═5$%25*!(15)%╚%-/╚%1(052@4╒=!4*!"549&15)3╚%=)3$╥@5╘]22┌!224=(
  888. ═5 ╘@;╫)┴(",┼,# ╨,#$╤,3 -('-╘82!╓;6-╙8@╘-*┬╚╩*╩!╙152@55"@24┘)
  889. ═5$┼!3*!604╤515,-#6┼╬:70@;&1┴(",╨, ╘@<╫1┴(&╤╧8╫┴═:6╪-('-╘82!╠
  890. ═;╓-╪;6%╪#2!╙=&$@;&]├>6╒╔;@╘@<╫1┴(&╤╧8╫┼═87@-('-╘82!╟;&]┬>&╒╔
  891. ═;@╘@<╫1┴(&=╠;╓)┘;6┼╬#2!╙=&$@9╓╤╧8╟┴═87@-('-╘82!╟;&]┬>6╒┴> ╘@
  892. ═<╫1┴(&1╙> ╘@<╫1┴(&1╙>0╘@<╫1┴(&1╙>@╘@<╫1┴('-╪#2!╙=&$@<╫─-('-╘
  893. ═82!╙>@╘@<╫1┴(&9╔;&╨-(&╤─82 ├,#$-('-╘82!╚:61┼#2!╠9&$@(╙8╘#2!╙
  894. ═=&$@>╞]╧;0╘-*┬╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘-*╩!═
  895. ═04┼.╚$╤/3╒ -#2╚╩*┬╩@9╘54╚$═%65!215-3#0╒═86┼╬#2!├;&─-:╫!╥97-╙
  896. ═(&╔╙<┬!╟971╔;@╘@8╓╒╨(",╤,╙,@.╓8╤/╨╘@8╞┘┼(#╔╞,@╘@;&1┴(&1╙> ╘@
  897. ═8╓╒╨("-┴;╞=═87@╧,┬ [;─^@34]21:!42$%.╚%!)#2!┬97$@.╞-╧;╟0╤#2!╔
  898. ═;╞,@9'-╪(#═/5$┴%4┼=)4╘6@24┘#4─5!4╘6@6"╒23╒1!5$┼/3@╘@:╞╒╨(#╔├
  899. ═;╓┘╘#3╔╞,┬!├;7 @(╙$╙-╥ [9├(_#2!┬;╞4@.╞8╙#2!╠9&$@9'-╪#2!┬97$@
  900. ═.╞-╧;╟0╤#2!─96,@9'-╪#2!╩;7 @.╞-╧;╟0-.╞8╙(&-═<" ├,3,╘#2!┬;╞4@
  901. ═.╞8╘#2!╠9&$@9'-┘#2!├;7 @(╓%╬9╓╒┴>"\╥#2!┬97$@.╞-╧;╟0╤#2!╔;╞,@
  902. ═9'-┘(#═╔3─-214%31:!9+5)/5$%424].#2!╩;7 @.╞-╧;╟0-.╞8╘(&-═<" ├
  903. ═,3,╪#2!┬;╞4@.╞8╒#2!╠9&$@9'-┘#2!┬97$@.╞-╧;╟0╤#2!─96,@9'-┘#2!╩
  904. ═;7 @.╞-╧;╟0-.╞8╒(&-═<" ├,3,╒#2!┬;╞4@.╞8╓#2!╠9&$@9'-┌#2!├;7 @
  905. ═(╓%╬9╓╒┴>"\╥#2!┬97$@.╞-╧;╟0╤#2!╔;╞,@9'-┌(#═:+5)/5$%424].#2!╩
  906. ═;7 @.╞-╧;╟0-.╞8╓(&-═<" ├,3,┘#2!┬;╞4@.╞8╫#2!╠9&$@9'-┌#2!┬97$@
  907. ═.╞-╧;╟0╤#2!─96,@9'-┌#2!╩;7 @.╞-╧;╟0-.╞8╫(&-═<" ├,3,╓#2!┬;╞4@
  908. ═.╟!╠=7,-(&╔═<"!╔;╞┼╘#3╔├;╓┘╘,2!╩;7 @.╞-╧;╟0-.╟!╠=7,@8╓╒╨(",╟
  909. ═*╥<-(&)╬92 ┌;6┼╬=7,-(&┼╬8╥!┌;╓]═(#═┬04@╠╚%=(3┌!.145$4┌!%4┼)/
  910. ═4╩!#2$5#2╘┼.1╙\-(&┼╬8╥!┌;╓]═#2!╩;7 @.╞-╧;╟0-.╞╒╔;╟5╙(&-═<" ├
  911. ═)╥╘╟#2!┬;╞4@.╞@-(&1┼8╥!┌;╓]═#2!─96,@>╞]╧;0╘@8╟!╠(#╔├;╓┘╘#2!╔
  912. ═;╞,@>╞]╧;0╘@:6┘├('╔╧;╓╘-(&╔═<" ┌8╓]╬= ╘┌:"!├;7 @(╥=()╨╘@8╞┘┼
  913. ═(#╔╙<&%├90╘@;&1┴(&┴╔9&4-(&5╧<┬ ├)# ╤#2!╙=&$@:&┼─90╘@:╞╒╨(#╔├
  914. ═;╓┘╘#3╔╙<&%├92!├;7 @(╥>@)╨╘@8╞┘┼(#╔╤#2!╠9&$@9╞┼╠; ╘@96]╥(",─
  915. ═,#$-('-╘82!╞:6╤╠#2!╩;7 @.╞-╧;╟0-.╟$@8╓╒╨(",╟42<@.╒&@455)5%,-
  916. ═(&)╬92 ┌8╓]╬= ╘@:╞╒╨(&-╠96%╬=7 -#3╔├;╓┘╘('-┼:2 @.╫-0145$╚%1(
  917. ═24┘'4┌!54*!!╚$))5 ╘-*┬╚╩*╩!╒4$1!5$6@04┘'3$53#0╒╒<&1┴=&4@8╓╤├
  918. ═#2!╠9&$@<╫@-(&%─8╥!─<╫@-(&-═<" ├86┘╟;6%╪(#═┴4─6@5╘6@/├╓@34%8
  919. ═24╒53:!!3─=,13\-(&)├8╥ ┌8╓]╬=#$-('-┬8╥ ├86┘╟;6%╪(#╔╔1┬!33╥╨@
  920. ═4─53150-.╞-╧;╟0╤('-╘82!╙> ╘@8╓╤├#2!╠9&$@<╫─-(&%─8╥!─<╫─-(&-═
  921. ═<" ├86┘╟;6%╪#2!┬8╓,@.╞-╧;╟0╥#2!╙8╞,@(╓%╬9╓╒┴>" [<╘%-1:!$14%,
  922. ═#3╔├;╓┘╘,┬!╙=&$@<╫─-(&-╠8╨╘@;&1┴('-┌#2!┴9&,@9'-┌#2!├;7 @(╓%╬
  923. ═9╓╒┴> ╘@8╞-├(#╔├;╓┘╘,╨╘@<╓)├("-┴;╞=═87@-.╞-╧;╟0╙('-╘82!╙>@╘-
  924. ═*┬╚╩*╩!╥3╒1!5$6@0╘]/4─1)3─%415,-#7)╧=&%╘90╘-*┬╚╩╚&9)4┼-4+*!#
  925. ═04╤#54╤!5$6@5#$╠5#(╠+┬╪╬+%0╤, ╘-*┬╩@=%=/╚$╒!0╒)/4┌!43┌!324╒0
  926. ═3$┼&6:!/55*@3$┼&10╒┴9&1┴(&╒┴8╥ @.╓%$1*!45╘^@04┘'3$53╚%1/1╘54
  927. ═2$52#2!├;&,-(&╤─82!=,0╘@861├(%╘╥#2!├;7 @(╓%╬9╓╒┴>" [:5.@5$┴%
  928. ═╚%-53: ^╚#(╩4$─_#2!┬8╓,@9&]╬90╘@<╓)├("-┴;╞=═87@@.╓┼&╚%-/+*!3
  929. ═54)44─%#5* ╥*┼!)#61╧;╞4@/#╨\#0╒╙=6)┴(&╒┴8╥ @.╫-50┼1204-4╚%17
  930. ═3┌!!3─=,15,-('-┼8╨╘@;&1┴(%╘╤#2!╙8╞,@73(-(&)├<╥!─;╓┘┼#2!┴9&,@
  931. ═(╓%╬9╓╒┴>" [;╘]04╥╥@5╘6@3─5%1*!43┌!!1$2@,┬╔020╒─;╓┘┼(#╨\/ ╘-
  932. ═*┬╩@;─]7╚$-!3$-53$%41:!4,2╤4,┬╤%5$,╬#0╘@/├╪^('-╒8╞$╠<╫─[<╫╚-
  933. ═('-╘82!╘,2 [5#$]4╒─═4╒╚-(#╪^/┬!┴9&1┴+'-┘.╫-┌#2!╙=&$@=#(@.╒0╥
  934. ═/5-9*╒-:#2 ^/├╪@861─82╤╙>#═╙>@╘@<╫1┴('0╙(#═4,╙╒36"═36@╘@/├╪^
  935. ═('-╒8╞$╠<╫@[<╫╚-('-╘82!╘-" [5#0]4╒@═4╒╚-(#╪^/┬!┴9&1┴+'-╪.╫0╥
  936. ═#2!╙=&$@=#4@.╒0╒/5-8*╒0╥#2 ^/├╪@<╫5┬82╤╙>#═╘,0╘@<╫1┴('0╓(#═4
  937. ═-├╒36"╒4,0╘@/├╪^(&%─9&$╠<╫@[=#$-('-╘82!╘-╥ [5#<]4╒@╦5#$-(#╪^
  938. ═/┬!╙=6)┴+'0╥.╫-╪#2!╙=&$@=#@@.╒0╪/50╥+5-8#2 ^/├╪@<╫5┬82╤╙>3═╙
  939. ═> ╘@<╫1┴('0┘(#═4.3╒362╒36 ╘@/├╪^(&%─9&$╠<╫@[<╫─-('-╘82!╘,3 @
  940. ═.╒0╤,#╒36"═360╘-*╩!┼5*!63╘┼,02$-#2╚╩*╩!╬15┴4+*!#04╤#54╤!5$6@
  941. ═82╤┬+&,╠+┬╪╬+&─-#2╚╩╚&%.3╒1(15*@55-%1┼5,╚$╤)5%1,1:!-04-23╨╒─
  942. ═:78╥(&╒┴8╥ @.╓1)5─┼$1:!!╚%-)1╘┘%1*!.54╒"15*@0┼╞@,@╘[:52@25.@
  943. ═05-354╒%1*!42$%4╚%1(1:!.54╒"15(-(&)╨;"!╨;╫,@.╘┼3╚$┼.╚%1(1:!!
  944. ═0╘-5355,051/4@╘@8╓╤├#2!┼;╫(@(╥1╞9┬ [=╘6@3─5%1*!43┌!53┬╒.14=!
  945. ═5$┼61:!42$6@3┼5-0─52#2!┴9&,@(╙ ╤(#═"6:!404═)3─>@250╟4┌!#3╘╒0
  946. ═3$5-14┘4#2!╠<╫(@(#═$259)1$6@0┼╞@5%=/#2!├;&,-(&5╧<┬ ├)&9╞#2!┴
  947. ═9&,@(╙ ╤(#══04═%╚$┼4╚$┘%1╘%4259%╚$%'04┼.#2!╩;7 @9&]╬961╔=@╒╨
  948. ═;╫,@;'-╥(" [;┼5-0─52╚$┼3╚%!/4╘┼4259%#61╧;╞5─:78@/#╨\#0╒═=6╨╥
  949. ═(&╒┴8╥ @.╓╒53%1)4$╤9╚$&@4╘┼'3─5$╚$┘534)%4╩!"6: ╥#2!┬<&╨@<&]╙
  950. ═;0╘@8╓╤├#2!┼;╫(@(╥1╞9@╘@861├(",─,#$-(&%╙; ╘@8╓╤├#2!┼;╫(@(╥1╞
  951. ═9@╘@861├(",─,#$-(&╔═<"!─;╓┘┼;75╠#7!╧<╓╘@87-╠#61╧;╞5═=6╨@/#╨\
  952. ═#0╘╩*╩!╬3╒1%╚%1(052@5╘6@05)%╚$-54┼)%3┼1,6:!-04═)3─>@0:!-24┘/
  953. ═4╩!,14%0#2╚╩╚$]&╚$9!251(╚%1(052@3─^@3╒9%4─9,3╒=3╚%=)3$╥@3╘-#
  954. ═55(╬#0╘┌8╓%╠8╓$@8╓╤├#2!╠9'@@=#$-(&╤─82!├;╫,╠> ╘@;&1╪('0╥#2!┴
  955. ═9&,@8╓]╙+'@-('-╘82!┴,3$@.╓$]*$-/4╥┴4,2─╦0╘]3*%0╥*2─╧,@╘┌8╓%╠
  956. ═8╓(@;&1╪('0╤#2!╠9&$@<╓┼╬+'@-('-┼8╨╘@;&1╪('0╥#2!╙8╞,@<╓┼╬+'@-
  957. ═('-╘82!┬,3(@.╓(]*%-)3┬┴4,2─═4╘┼.*%0╥*2─╧,@╘┌8╓%╠8╓,@;&1╪('-┘
  958. ═#2!╠9&$@<╓┼╬+'@-(#╪^/┬!═=6╨╥#2!╙=&$@8╙$╙(#═├/5-)3┬┴362─-.╞-┴
  959. ═;&-─('-┼8╨╘@;&1╪('0╪#2!╠9&$@8╓]╙+'@-(&╤─>"!╘-╨╘@<╓)├(&-╧<╥╤╪
  960. ═#2!╙96,-(&╤─>"!╘-0╘@<╓)├(&-╧<╥╤╪#2!├;&,-(&╤─>"!╘-@╘@861├(&-╧
  961. ═<╥╤╪(#═─23╘╚0╘]3*%0╪*2╒#3╒,╚5#<╔*╘-/4╥┴4-┬─═0╘]3*%0╒*2─╧,@╘@
  962. ═/├╪^(&1╔=├(-(&-╠8╨╘@;&1╪('0╙#2!┴9&,@<╓┼╬+'@-('-┼8╨╘@;&1╪('0╘
  963. ═#2!╙8╞,@<╓┼╬+'@-('-╘82!─,├$@.╓0]*%-)3┬┴4,╥─═4╘┼.*%0╘*2═─22─╧
  964. ═,@╘┌8╓%╠8╓4@<╓5├#2!╠9'@@=#4-(&╤─82!╙:6╪╠> ╘@;&1╪('0╓#2!╙8╞,@
  965. ═<╓┼╬+'@-('-┼8╨╘@;&1╪('0╫#2!╙8╞,@<╓┼╬+'@-('-┼8╨╘@;&1╪('0╪#2!╙
  966. ═8╞,@<╓┼╬+'@@.╓5)/2┴324╪╚5#4╔+5-)3┬┴4-┬─═4╘┼.*%0╫*2╒324╪╚5#@╔
  967. ═*2\╥#2 ^/├╪@9&┼╓,@╘@8╓╤├#2!╠9'@@=#,-(&%─8╥!├;╫,╠> ╘@8╓╤├#2!╠
  968. ═9'@@=#0-(&%─8╥!├;╫,╠> ╘@<╫1┴(&4╥,┬ [93╘╚0╘]3*%0╙*2═#3╒,╚5#0╔
  969. ═*╓5)*2\╥#3╔├86╤├9┬!╠9'@@=#─-(&╤─82!╙:6╪╠> ╘@<╓5├#2!╠9'@@=#$╨
  970. ═#2!╙8╞,@<╓┼╬+'@-('-╘82!╞,├,@.╓8]*%-)3┬┴4.2─═4╘┼.*%0╤,"─╔+╙(-
  971. ═.╞-┴;&-╟(&╤─>"!╘-@╘@;&1┴('-╔;┬╤╪#2!╙96,-(&╤─>"!╘. ╘@<╓)├('-╔
  972. ═;┬╤╪#2!╙96,-(&╤─>"!╘-╨╘@<╓)├('-╔;┬╤╪#2!╙96,-(&╤─>"!╘-0╘@<╓)├
  973. ═('-╔;┬╤╪(#═╟23╘╚4╘┼.*%0╓*2╒324╪╚5#@╔+5-)3┬┴4-╥─═4╘┼.*%0╒*2─╧
  974. ═,@╘@/├╪^(&1╔=├(-(&-╠8╨╘@;&1╪('0╘#2!┴9&,@8╓]╙+'@-('-┼8╨╘@;&1╪
  975. ═('0╙#2!╙8╞,@8╓]╙+'@-('-╘82!╟,╙$@.╓<]*$-/4╥┴4-"─═0╘]3*%0╙*2═╟
  976. ═22─╧,@╘┌8╓%╠8╓@@8╓╤├#2!╠9'@@=#8-(&╤─82!├;╫,╠> ╘@;&1╪('0╫#2!┴
  977. ═9&,@8╓]╙+'@-('-┼8╨╘@;&1╪('0╒#2!╙8╞,@8╓]╙+'@-('-┼8╨╘@;&1╪('0╪
  978. ═#2!╙8╞,@8╓]╙+'@@.╓┴)/2┴#3╒,╚5#8╔*╘-/4╥┴4-╥─═0╘]3*%0╒*2╒#3╒,╚
  979. ═5#@╔*2\╥#2 ^/├╪@9&┼╓,@╘@8╓╤├#2!╠9'@@=#,-(&%─8╥!╙:6╪╠> ╘@8╓╤├
  980. ═#2!╠9'@@=#0-(&%─8╥!╙:6╪╠> ╘@<╫1┴(&@╙,┬ [:#╘╚4╘┼.*%0╙*2═324╪╚
  981. ═5#0╔*╓┴)*2\╥#3╔╫:&5╫(&-╠8╨╘@;&1╪('0┘#2!╠9&$@8╓]╙+'@-(&╤─>"!╘
  982. ═,3 -(&%─8╥!├;╫,╠> ╘@<╫1┴(&─╙,╥ [:3╘╚0╘]3*%0┘*2═#3╒,╚5#$╨*2─╧
  983. ═,@╘-*┬╩@:50╟4┌!!3$╥@1$]73─┴)3$╥@1┼)/3:!(15)%+@╘-9&]╫;╞┴╔;&╨-
  984. ═*┬╚╩*╩!├3$5!4╩!"549&15(-*╩!┴╚$╤)5%1,1:!-04-23╨╘-<╓5╘8╟5╞(&╒┴
  985. ═8╥ @.╫!55*!"549&15)3╚%=(15)%╚%1(15╞@0╘%.╚$)%╚$┴54┼0-(&╤─82 ├
  986. ═,# -('-╘82!┬=69╞97(-(&╤─82!┌=&5═<" [:$┼'2*!"651%#7-╘86)╒9┬!╙
  987. ═=&$@8╟5╞9╞5╥*╙$-(#╨\/ ╘-(#╪^/┬!╙971┬=68-8╓╤╥9')┴=╥!╠9'@@(╙ ╪
  988. ═#2!╠9&$@(╙ ╨#3╔╞;╓]╠(&╤─>2 ├,# -.╞1╧<&4@<╫1┴("┴┬=69╞97(╔+'─-
  989. ═(&┼╬>0╘@8╞┘┼(#╔─;╫!┼#2!╔;╞,@8╟5╞9╞5╥*╙$-(&1┼> ╘@8╞┘┼(#╔╞;╓]╠
  990. ═#0╘╩*┬╚╩╚&╒9╚$=/3╘1.15-3╚$)55*!╔)╘╓@0:!$3╒!%#2╔├;')─<╞%╫╚&╤─
  991. ═8:!╟;&]┬>&╒╔;@╘╩╚&╤╙<╩"@.╓┘%142@5$^@1╘54╚$┼.5$^@5$┴%╚%))1╘┴4
  992. ═╚$-/3%5-3@╘╩╚&)├8┌ ┌979┼;╩ [95┴03$%)3─5$╚$┼.╚$╒/4─6@1$5404┼,
  993. ═╚$)%3$]7#2╩@;&1┘╚",─.# -*╩!╙='╞@8╟5╞9╞5╥╚#═╨4─5354╒!0─╤9╚%1(
  994. ═25.@5╘┼,3*!"1:!!╚$╤)5%1,10╘╩╚&-╠8┌"@.╘╒/4─6@149&24-)14┘4+@╘╩
  995. ═.╞5╓96┌@861├╚&)╒9╞9┼<┬╠╤#2╩@<╫1┴╚&)╒9╞9┼<┬╠╤#2╩@;&1┴╚&=╠;╓)╪
  996. ═;6%╪#2╩@<╓5├#2╩@<╓)├╚&=╠;╓)╪;6┼╬#2╩@=&%╪#2╩@:6┘╪#2╩@;&1┘╚&=╠
  997. ═;╓)┘;6%╪#2╩@8╞5╤╚#╔╥97-┼= ╘╩.╟┼┴>:!╠9&&@(╥0╨, ╘╩╚&╤─>:!╟;&]┬
  998. ═>6╒┴> ╘╩.╞)╠86┬@<╫1┴╚"┴┬=69╞97(╔+'─-*╩!─97─-*╩!├<'╞@9╓╤╧8╟┼═
  999. ═:6╪-*╩!┬8╫.@.╞)╠86@-*╩!╠9&&@8╟5╞9╞5╥#2╩@96]╥╚",─.# -*╩!╙=&&@
  1000. ═8╟5╞9╞5╥#2╩@8╞┘┼╚#╔╫:&]╨964-*╩!╔;╞.@8╟5╞9╞5╥*╙$-*├╔╫:&]╨966@
  1001. ═9&5╪#2╩@8╞┘┼╚#╔┘87─-*├╔╥97-┼=*!╠9&&@(╙"@.╓┘%142@5$^@4─53152@
  1002. ═5$┴%4╘6@1╒594╨╘╩╚'-╘8:!╟;&]┬>&╒┴> ╘╩╚'-╘8:!╟;&]┬>6╒┴> ╘╩╚&╤─
  1003. ═8: ├)&9╞#2╩@<╫1┴╚&=╠;╓)╪;6┼╬#2╩@<╫1┴╚&=╠;╓)┘;6┼╬#0╘╩*┬╚╩╚&┘%
  1004. ═6%0╠╚%)%042@04┘$╚$1205>@4$],64=/3┼,-#7)┼861─<╞%╫(&╤─>2 ├,# -
  1005. ═('-╘>2!╔;╞1┼> ╒╧8╞╔╠;╓]╨(&╤─>2!╔;╞1┼> ╘@;&1┴('!╧;'┼╠:7-╘+'─@
  1006. ═.╓9)4┼-4+*!42$6@3┼5-0─52╚$]&╚%!/24┘44╨╘@8╞┘┼(#╔├;╓┘╘(#═┬552@
  1007. ═24:@3┼5-4$])3┼13╚$┼3╚%╔%4─^@5$┴%3@╘@:╞╒╨(&]┬:╞1╧;╞4@.╒=%╚$%2
  1008. ═1:!!5*!42$6@14┘$╚$]&╚%1(1:!,25-4#3╔├;╓┘╘('-╘82!├;╫5╬='!╘<╨╘@
  1009. ═:6┘├(&┼╬9&5╪#0╘╩╚')/5$%41:!04─]*14-4╚$%.1*!$4─%7╚%1(1:!03╘╤9
  1010. ═1╘].#2╩@;4%+1:!355)%╚$)51─9%4╩!"14┼.1┌!$4─%73╩!43┌!)4┌!#3$5!
  1011. ═4┬$-#3╔─;╓┼╘(&╔╙<┬!╥;╫1╨<╞]╩#0╘╩╚&-/3┼9%4┼2@6$╒)3╩!!3─2@6$╒!
  1012. ═6*!43┌!#3╘╤534┘3#0╘@;&1┴(&╤╧8╫┴═:6╪-(&╤╙<@╘@;'-╥#2!╠<╫(@(#═8
  1013. ═╚$╒/1* ╪#2!╙=&$@;&]├>&╒╔;@╘@8╓╒╨(&=╠;╓)╪;6┼╬#2!┬8╫,@.╞┘┴: ╘@
  1014. ═<╫1┴(&=╠;╓)╪;6┼╬#3╔╬86@@;&1┴(&╤╧8╫┼═:6╪-(&-═<"!╟;&]┬>6╒╔;@╘@
  1015. ═8╞-╙(#╔╒:'5╚#2!╙=&$@9╓╤╧8╟┼═:6╪-.╟5╚=6@@;&1┴(&╤╧8╫┴═87@-(&╤╙
  1016. ═<@╘@;'-╥#2!╠<╫(-('-╘82!╠;╓-╪;6%╪#2!├;7 @9╓╤╧8╟┴═87@-(&)├8╥ ┌
  1017. ═;╞]╫87─-('-╘82!╟;&]┬>&╒┴> ╘┌;╞]╫87─@;&1┴(&╤╧8╫┼═87@-(&-═<"!╟
  1018. ═;&]┬>6╒┴> ╘@8╞-├(&5╧<╞9╔;&╨-('-╘82!╟;&]┬>6╒┴> ╘-*╩!╔1╩!54╘┼.
  1019. ═1┌!42$6@96]╥+4)51─9%4┬╥@0╘]06:!)3┼1/╚$1205=)3─>@0┼5&1─52#2╩@
  1020. ═84┘$╚%1(14┌@0╘╤%05*@5$┴%╚&5╧<┬╒"549&15(-#65╧<╞9╔;&╨@;&1┴(&9╔
  1021. ═;&╨-(&)┼<2!╧8╞╔╠;╓]╨#0╘@/├╪^('-┼=&)╒9@╘@;&1┴(",\96]╥8╟5╞#2!╙
  1022. ═=&$@=&5═<#$-(&╤─82 ├/╞5╧<╞)╒9@╘@<╫1┴('1┼;7 ╤*╙$-#2!╠9&$@;&]├
  1023. ═>&╒╔;┬ [;&]├>&╒╔;╩!.3╒>@0╘].5$%)3┼.@0╘],54╒.#2!╠<╫(@(#═┼04-(
  1024. ═╚$-/3%5-3╩!)4┌ ╤,├┬@0┼┼415,-(&)├8╥ ┌979┼;┬ [<╘^@5$┴%4─6@34┼'
  1025. ═2%2@0─6@0:!#05)260╘@;&1┘(",─.# -('-╘>2!┬=69╞97(-('-╘>2!╘96╒╨
  1026. ═,0╘@8╓╤├#3╔┼=╞5╬('-╘82!╘,@╘@861├(&)╒9╞9┼<┬╠╤#2!╙=&$@8╟5╞9╞5╥
  1027. ═*╙$@.╓5!0╘┬@0╘],54╒.╚$┼3╚#$╥.*!"651%4╨╘@;&1┴('0╥#2!┴9&,@=&5═
  1028. ═<#$╦,2 [;─]7╚%=%╚%=)3$╥@4╒1!4┼2@052@5$┴%#2!╙=&$@=&5═<#$╦,2 [
  1029. ═0╘],54╒.#0╘@;&1┴(&╤╧8╫┴═87@-('-┼8╨╘@<╓)├(&╤╧8╫┴═:6╪-('1┴>" [
  1030. ═=$]404╥@3┼5-0─52╚$]&╚$-/3%5-3┼.@5$^@1$\-(&┼╬>" @.╘4╬1╥┌@1─┼,
  1031. ═3*!#3╘╤534┘3╚#$╬+├,-(&╤─>2!╠;╓-┘;6%╪#2!┬;╞4@.╞9╧;╫ -(&┼╬8╥!╠
  1032. ═;╓-┘;6%╪#3╔╞;╓]╨(&╤─>2!╠;╓-┘;6%╪#2!╠9&$@(╙ ╨#3╔╟;╓]╨(&5╧<┬ ╚
  1033. ═=&5═<#$╔+'─@.╓5╧<┬╒"549&15(-('!╚80╘╩╚&╒!64)%╚%!55*!!3╩!┼;╫*@
  1034. ═0─5,3╒<_#2!┼;╫(@*&)╒9╞9┼<┬─╠>0╘@<╫1┴("┴┬=69╞97(╔+'─-(&╤─82 ├
  1035. ═,# @.╓╒)1╘┴4╚$%3╚%=%3$╥@0╘╤%05*@252@3─]7#2!╙=&$@*'1┼;7 ╤*2╤┘
  1036. ═#2!╨;&$-(&1┼>0╘@8╫!┘(&╤╧8╫┼═:6╪-(&)├<╥ ┌9╓]╧< ╘@;&1┴(&)╒9╞9┼
  1037. ═<@╘@96]╥(",─.# -('-╘82!┬=69╞97(-('-╘82!╘96╒╨,0╘@8╞┘┼(#╔┬;╓]╨
  1038. ═#2!╔;╞,@8╟5╞9╞5╥*╙$-(&┼╬8╥!╘96╒╨,2╠╤#3╔┬;╓]╨(&1┼> ╘@8╞┘┼(#╔╞
  1039. ═;╓]╨#2!╩;7 @;╓)╩;&]╧< ╘-;╓)╩9&]╬90╘╩*┬╚╩╚'-705"@0┼5&1─524╨╘-
  1040. ═<╫=┴<&)╒9┬!╠9&$@=╞╒├<╓(-(&5╧<┬ ├)# ╥(#═╨4─545%╞@5%))0╘═9+*!%
  1041. ═2#\-('-╘82!╓;6-╙8@╘@;&1┴(",─,#@-(&5╧<┬!┌=&5═<" [6┼1%35 ]2$┼'
  1042. ═2*!"651%╚$╔54╒2@1─╤)4%,-('-╘82!┌=&5═<" [0─545╘5%3╩ ─,╙"@04┘$
  1043. ═╚"0╙. ╘-(&╔═<"!═86┼╬(#═┴4─]53─2@04┘$╚$%23╒5.1*!71:!'3╥╪╬+@╘-
  1044. ═('1╪=" ╟9╘5%╚&)204┼.+*!72$%4╚$1/╚%┼/5:!704┘4╚%1/╚$1/╚"<-('1╪
  1045. ═=" ╟5$].24=(5#\╟#0╘╩*╩!╥3╒1!5$4╠╚%!23╘╔%0╒0╠╚$%.1*!35$]21:!4
  1046. ═2$6@4$])3┼13#2╚-*╩!╘2$┼3╚%!!4┼2@25.@0:!324=.249)0╘%.5*!#2$%.
  1047. ═1╘6@4╘┼.0╘4-*╩!6,┬╪╨+╩"@;─]7╚$┼4╚$┼3╚$&@0╘]-4$╤%5$5,6:!'14┘%
  1048. ═4─%,╚%!/3%┼'3╘┌@4$╤/5%1%4┬╪-*╩!┴╚%-%5*!/1╩!03╘┼.5%.@25.@4─5!
  1049. ═1*!)3┬╥@4─]4051%1*!!3─2@4%)/2─5#5$5$+*!!3─0-*╩!03$]45$5$╚$┼.
  1050. ═5$^@5$┴%╚$1205=)3─>@0┼5&1─52╚"┴┼;╫*@3╒*@3─]234%,*2╪-#7)╧='!╥
  1051. ═;╓╚-#2╩@8:!.14%4╚$╒!0╒)/#6┘┼9╥!═86,@(#═├2$%.1╘6@5$┴%╚%-)1╘┌@
  1052. ═3╘:@0:!45╘\╟4┌!#3╘╒03$5-14┘4#2!├;&,-(&╤─82!=,2 [3┼5-0─52+@╘@
  1053. ═96]╥(",─9╞8-(&%─8╥ ├)# ╤#2 \/#╨-#2╚═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═
  1054. ═+2╘═+2╘═+2╘═+2╘═#2╩@=$┴%4╘6@34%#4─]3╚%)%4$╤!0╘6@5$┴%╚%!2159)
  1055. ═3╒53╚%!23╘╔%0╒1)3╘╪-*╩!354)23╒5424┘%+@╘-<╓╒╒;'2@;6%├╚#══54╤4
  1056. ═25!,6:!45╘^@4╘┼'3─5$╚#@═0─┼4#2 [3┼5-0─524╙╩@82╔┘+╙8╘╚"╘^╚&$-
  1057. ═('-╘8:!┌,╨╘@8╓╤├╚* [=$┴)4┌!-54╤425!,6:!)4┌!&3╒*@3─]234%,#2!┼
  1058. ═;╫*@(╥1╞9╩ [3┼5-0─524╥╥@22┘%+╩!8/2╘╓-"╪╬-├0-(&%─8┌ ├)# ╤#2!╙
  1059. ═=&&@>├0-(&╤─8: ╚>├,╔+'─-('-┼8╨╘@<╓)├╚"┴┌-"─╠>0╘@/#╨\╚* [84╤,
  1060. ═╚$1/3─6@.┬─-#7-═=6╤╘>┬!═86,@.╓╒53%1)4$╤9╚%173┌!324=.142@."╒"
  1061. ═250-(" @.╘┘534)%4┼,┌╚&$╩>2\╓-* ═/╩!┴#2!╙=&$@>├$-(&-╠8╥ @.╓%.
  1062. ═1*!42$┼3╚$╒53%1)4$╤9╚$┼3╚%-014-)1─┼#04╤,60╘@96]╥(",─9╞8@.╘9/
  1063. ═4╩!42$6@4%)/2─5#5$┼/3╩!005)4+*!72$5210╘@861├(",─,#$@.╘┘534)%
  1064. ═4┼.@05)%╚"╘╤,3 ╬+├$╤,*!!3─2@,"╪╬-# -('-╘82!┌,@╘@;&1┴("┴┌,2─╠
  1065. ═>0╘@<╓5├#2!╙8╞,@*'╚╥*2╤┘#2 \/#╨@(#═┴3$╥@1$].1: ┌*0╘-<')╧:╞5├
  1066. ═="!═86,@(#═╘2$6@04-454%,╚%!23╘╔%0╒1)3╘┌@4─]55$┼.10╘[=$┴%╚%)/
  1067. ═551)3─6@5$%+15.@5$┴%╚%!/24┘4#3═=,:!=,╩!=,╥╥@4─]4051%4┌!!3─0-
  1068. ═.╒!23╘╔%0╒13╚$┼4+*!!3─2@4╒1/4─53╚%1(10╘[4─5354╤4╚$┼.╚%╘╤╚%╘╥
  1069. ═╚%╘╙+@╘-(&╤─>2!=,2 [;55,5$┼03%╞@1─┼24╒2@4─]4051)3╘┌@0╘],54╒.
  1070. ═#2!╠9&$@83$╤#2 ^/├╪@<╓╒╒;'0-('-╘82!╨,70-(&╤─82!─,├$-(#╪^/┬!╙
  1071. ═;75╠= ╘@<╫1┴(' ╥= ╘@;&1┴(&<╙,0╘@/├╪^('-═=6╤╘#2!╙=&$@<#-╘#2!╠
  1072. ═9'─@73(@.╫-%0╘].1*!#3╘╤534╪-(&╤─82!┬,3(-(#╪^/┬!╙;75╠= ╘@8╓╤├
  1073. ═#2!┴9&,@<#%╘#2!╙=&$@<#%╘#2!╠9&$@93(╥#2 ^/├╪@<╓╒╒;'0-(&-╠8╨╘@
  1074. ═861├(' ╥= ╘@<╫1┴(' ╥= ╘@;&1┴(&@╙,@╘@/├╪^('-═=6╤╘#2!├;&,-(&%─
  1075. ═8╥!╨,╫0-('-╘82!╨,╫0-(&╤─>2!=,╥ [=$┴)4─2@0╘],54╒.#2!╠9&$@8╙$╙
  1076. ═#2 ^/├╪@<╓╒╒;'0-(&-╠8╨╘@861├(' ╤= ╘@<╫1┴(' ╤= ╘@;&1┴(&8╥,╨╘@
  1077. ═/├╪^('-═=6╤╘#2!├;&,-(&%─8╥!╨,╟0-('-╘82!╨,╟0-(&╤─82!╔,╙,-(#╪^
  1078. ═/┬!╙;75╠= ╘@8╓╤├#2!┴9&,@<#-╘#2!╙=&$@73,@.╫)/5$%4142@>@╘@=&%╪
  1079. ═#2!╠9'─@>╞1╔=┬╤╪(#═╘04),1:!/1╩!$+╥┴:*╒╚╨*0╘@(" [;─]7╚'╞@0╘].
  1080. ═5$%)3┼.@4%)/2─5#5$┼/3╩!#3╘┘35 ╘-(&╤─82!╨,70-(#╪^/┬!╙;75╠='╚-
  1081. ═(&╤─>"!┌;╓]═#2!├<'@@(╙8╘#2!┬97$@8╓]╬='@-('-╘>2!╘96╒╨,0╘@;&1┘
  1082. ═('╔╧;╓╘-(#╪^/┬!╙;75╠= ╘@;&1┘('1┼;7 ╤#6-╧;╟1╪(&-╠8╨╘@861├(",╓
  1083. ═-" [;╘9&4╘54╚%1(1:!#3╘]21$┼.051%#2!╙=&$@73$@.╫)/5$%4142@04┘$
  1084. ═╚%!23╘╔%0╒1%1 ╘@8╓╒╨(&╤╧8╫┴═:6╪@.╫-%1:!)1╩!)5*!)4┌!!╚$╤/0╘%,
  1085. ═╚$╒)3─┼-54╘-(&)├<╥!╬;╫1╪;6┼╬#2!╙=&$@;&]├>&╒╔;@╒╬;╫1╪;6┼╬(&-═
  1086. ═<"!╠;╓-╪;6%╪#2!┬8╓,@;╞]╘>&╒┴> ╘@<╫1┴(&╤╧8╫┴═87@-#6┘╧='┴═87@@
  1087. ═;&1┴(' ╥= ╘@/├╪^('-═=6╤╘>@╘@8╫!╪(",╓- ╘@8╞5╤(&-╧;╟1┘#2!╠9'─@
  1088. ═>╞]╧;0╘@/├╪^('-═=6╤╘#6-╧;╟1┘(&-╠8╨╘@861├(",╓- ╘@<╫1┴(%╘╥(#═╥
  1089. ═3╒1!5$5$╚$%.1*!04─]*14-4142@>0╘@8╓╒╨(&╤╧8╫┼═:6╪-(&)├<╥!╬;╫1┘
  1090. ═;6┼╬#2!╙=&$@;&]├>6╒╔;@╒╬;╫1┘;6┼╬(&-═<"!╠;╓-┘;6%╪#2!┬8╓,@;╞]╘
  1091. ═>6╒┴> ╘@<╫1┴(&╤╧8╫┼═87@-#6┘╧='┼═87@@/#╨\(" [84╤,╚$1/3─4-#2╩@
  1092. ═;&1┴╚",\96]╥8╟5╞╚#═╞25)35*!71:!.145$╚%1/╚$-,14%2╚%1(10╘╩╚'-╘
  1093. ═8:!┬=69╞97*@.╓5╧<╩!"549&15(-*╩!╠9&&@(╙┘┼;╫)┬=68-*╩!╙=&&@8╟5╞
  1094. ═9╞5╥*╙$-#2!╠9&$@(╙ @.╫)%4╘54╚'┼-24┌@04┘$╚'┼-05@-('-╘82!╠;╓-┘
  1095. ═;6%╪#2!╙=&$@;&]├>&╒┴> ╘@;&1┴(",─9╞8-('-╘82!╠;╓-┘;6┼╬#2!╙=&$@
  1096. ═;&]├>&╒╔;@╘-<╞5┴9'!╘<╥!╠9'─@:6┘─97@-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙
  1097. ═=&$@<#%╪#2!╔;╟─-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#%┘#2!╔;╟─-(&╤─
  1098. ═82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#%┌#2!╔;╟─-(&1┼8╥!├;╫5╬='!╘<╨╘@;&1┴
  1099. ═('!╧;'┼╠:7-╘+'─-('-╘82!╨,╟@-(&┼╬>0╘@;&1┴('!╧;'┼╠:7-╘+'─-('-╘
  1100. ═82!╨,╟─-(&┼╬>0╘@;&1┴('!╧;'┼╠:7-╘+'─-('-╘82!╨,╟╚-(&┼╬>0╘@9&5├
  1101. ═(&-╧=6┘╘<'1╙#2!╠9&$@<&]╠>6╤╔<╫0╠>0╘@<╫1┴(' ╙> ╘@:6┘┘#2!╠9&$@
  1102. ═<&]╠>6╤╔<╫0╠>0╘@<╫1┴(' ╙>0╘@:6┘┘#2!╠9&$@<&]╠>6╤╔<╫0╠>0╘@<╫1┴
  1103. ═(' ╙>@╘@:6┘┘#2!╙='─@:6┘─97@-(#╪^/┬!╨<╞]╩96-╘+' ╤>#═╨,7─[<#%┌
  1104. ═#2 ^/├╪@<')╧:╞5├="╤╨,╟@[<#)┘.╫ ╥>@╘@/├╪^('!╥;╓╔┼8╫0╠<#-╪.╫ ╙
  1105. ═>3═╨,╫╚-#2!╠9&$@:&┼─90╘@8╞5╤(#╔─;╓┼╘#2!╠9&$@<#)╪(#═╚241$14┌@
  1106. ═1─%#1:!#2$5#2╨╘@<╓5├#2!╙8╞,@<#%╪#2!╘87─@(#═┘/2┴8,┬╒8,2─-(&╤─
  1107. ═82!╨,╫─-('-┼8╨╘@<╓)├(' ╥>2 [83╘╚63,═63(╔#2 ^/├╪@<╓╒╒;'0-('-╘
  1108. ═82!╘96╒╨,0╘@;&1┴(' ╙> ╘@<╓5├#2!╙8╞,@<#)╪#2!╘87─-(&╤─82!╨,╟─-
  1109. ═('-┼8╨╘@<╓)├(' ╤>0╘@/├╪^('-═=6╤╘#2!├;7 @=&5═<#$@.╓┼&╚%@╤*┼─╥
  1110. ═+5─╤*┼@╥╚#┌@,*!42$5.╚$9!0╘4-(&)═:2 ┌9&]╔=" [25.@5─┼324),10╘@
  1111. ═9&5├(&-╧=6┘╘<'1╙(#═╧5$┴%4┼=)4╘6@4─5!1*!)3╩!214╒!24┘)3─<-(&)┼
  1112. ═<2 ┌86)╧<╟0@.╒!/24┘44┌!!3─2@4─5455).#3╔╨;╓]╨(&┼╬8╥!╔;╞1┼> ╘@
  1113. ═:6┘├(&┼╬9&5╪#2!╔;╞,@:6┘─97@-(&1┼8╥!├;╫5╬='!╘<╨╘@8╞┘┼(#╔╨;╓]╨
  1114. ═#3╔┴8╞]╥="!╥=',-#3╔─;╓┼╘(&╤─82!╨,7@-('-╘82!╪,0╘@;&1┴(' ╤>0╘@
  1115. ═<╫1┴('─╤#2!╠9&$@<#)╪#2!╙=&$@>#(-(&╤─82!╨,╟─-('-╘82!┘,@╘@:╟-╥
  1116. ═(&1╥87<-(&╤─82!╨,╟@-('-╘82!╪,0╘@;&1┴(' ╥>0╘@<╫1┴('─╤#2!╠9&$@
  1117. ═<#-╪#2!╙=&$@>#(-(&╤─82!╨,╫─-('-╘82!┘,@╘@:╟-╥(&1╥87<-#2!─96,@
  1118. ═8╓]╒;╟1╨=',-(&)╬92!╨;╓╤┘;&]╧<" [:5.@252@2┼535*!!╚%1224%.1╘╤%
  1119. ═/╨╘@:╞╒╨('!╧;'┼─;╓┘┼#0╒╨;╓╤┘;&]╧<"!╠9'─@:6┘─97@-(&╤─82!╨;╓╤┘
  1120. ═;&┼╙="╤┘#2!╙=&$@<#)╪#2!╔;╟─-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#)┘
  1121. ═#2!╔;╟─-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#)┌#2!╔;╟─-('-╘>2!╔;╞1┼
  1122. ═> ╘@/├╪^('!╥;╓╔┼8╫0╠<#)╪.╫ ╥>3═╨,╟╚-#2!╠9&$@<#)╪#2!╙=&$@>#$-
  1123. ═(&╤─82!╨,╟─-('-╘82!┘,0╘@;&1┴(' ╙> ╘@<╫1┴('@╥#2!╠9&$@<#-┘#2!╙
  1124. ═=&$@>3(-(&╔╙<┬!─<╞%╫#0╘@;&1┴(' ╥> ╘@<╫1┴(' ╙> ╘@;&1┴(' ╥>0╘@
  1125. ═<╫1┴(' ╙>0╘@9&5├(&-╧=6┘╘<'1╙#2!┬97$@<&]╠>61╧;╞4-(&╔═<"!╨;╓╤┘
  1126. ═;&]╧< ╒╨;╓╤┘9&]╬92!╠9&$@<#%╪(#═├3$]31:!42$6@4$],64=/3@╘@<╫1┴
  1127. ═('@╥#2!╠9&$@<#%┘#2!╙=&$@>3(-(&╤─82!╨,╫@-('-╘82!╪,0╘@;&1┴(' ╙
  1128. ═>0╘@<╫1┴('─╤#2!╩<╫(@9')┴=╨╘@<╟1╙#0╘@='┴╘("=╙04╒%╚%1(24┘'╚%=%
  1129. ═╚$1/╚$5615)9╚$┘)1╘┴4+*!╨24┘+63╩@)╨╘@='┴╘("=44┼╞@5$^@5$%+1:!/
  1130. ═5─52╚%1(1:!73╒),1"$╟#0╘-*┬╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═
  1131. ═+2╘═+2╘-*╩!╟14┘%4─%,╚%%515-424].04),12╒604╤51:!%4┼)/4╩!04─]#
  1132. ═14154─4-#2╔├:&]╦9:!╠9'┬@(╙ ╨#2╚┌;&]╧<*!╠9&&@.╞-╘97┴╘+'@-*╩!┬
  1133. ═97&@.╞1╧;╞4-*╩!╩<╫*@8╓┴╥;╫5╘#2╩@:6┘╪#2╩@:╞╒╨╚#╔╠;╓]╨#2╚┌9&]╬
  1134. ═9:!╥=',-*├╔├=&5╪=*!╚97┬@,&2@.╓-╥#2╩@='┴╘╚"=33╘╒%5$┴)3─>@0╘┴/
  1135. ═2╘5$╚#╚╚)╨╘╩╚&┴┼>* ╨9# ╨#2╚-('1╪=" ╟;─%21┬$╟#0╘╩+2╘═+2╘═+2╘═
  1136. ═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+0╘╩╚&1205=)3┬>@0:!,24┘%+╩"@8:!&
  1137. ═04┴.╚$╤!2$╪╬#0╘╩*┬╩@<╘]-1:!54╘5&54╥@34%#4─]3#0╒├:6┘╔="!═86,@
  1138. ═(#══04-23┌!43┌!)3─┼424%,25╔%╚%1(1:!#3╒5.5$52#2!╠9&$@73$@.╘18
  1139. ═╚$]2╚$19#2!╠<╫(-(#╨\/" @.╫1(1:!$6"\╥╚$╒!2╘53╚$&@3─┼#15*@3$]/
  1140. ═2╘┼.1┌!,24┘%#0╘╩*┬╚╩*╩!═04-23┌!43┌!404═%╚$&@4╒1%4*!)3╩!╪#0╒╪
  1141. ═<╫1┼<"!═86,-(&╤─>"!─>" [;┼5-0─52╚$]&╚$╤/3╒"@251%4─%424].4╨╘@
  1142. ═/├╪^(&-╔;╞┼╘+&1╪#7┴╠;╓]╨(&╤╙<┬!├:'5╬:╨╘@8╞5╤(&9╔>&,@.╫501$%4
  1143. ═1:!#3╘╤534╪-('-┬8╥!─>0╘@8╞-├(&9╔>'─@.╫1)346@5$^@4╒1%4*!)3╩!┘
  1144. ═#2!─97@-(&)╬92!╪;&]╧< ╒─;╓┘┼(&╤─82!╧;&1╪(#═╨3$]4╚%1(1:!,05-4
  1145. ═╚$-(54┘+#2!┼;╫(@8╓┴╒;╞╠-(&]╥82 ╚8╟5╞9╞5╥*2╤┘#2!╙=&$@*&)╒9╞9┼
  1146. ═<┬─╠>0╘@<╟1╙#0╒╞:7┴├('!╚80╘@;&1┴(&]╠9'@-(&]╥82 ╚8╟5╞9╞5╥*2╤┘
  1147. ═(#═╨3$]4#2!╙=&$@*&)╒9╞9┼<┬─╠>0╘@;&1┴(",─9╞8@.╫501$%41:!#2%5.
  1148. ═2╨╘@<╫1┴(&]╠9'@-('-╘82!├:'5╬:╨╘@;&1┴(",─.# @.╓┼.0╒)%05-%╚%1(
  1149. ═1:!#3╘╤534╪-(&5╧<┬!┬=69╞97(-('-╘82!┬=69╞97(-(&)╬92!├,@╘@:6┘├
  1150. ═(&)╒9╞9┼<┬╠╤#6,╥#2!╨;&$-('-┬8╥!─>0╘@8╞-╙(&-╧;╟0-(&%─8╥!─> ╘@
  1151. ═:68@:2╤=,2 [9$^@5╘6@55-%╚&┼╬>:!/4╩!─97─_#2!╔;╟─-(&5╠<╓4-(&1┼
  1152. ═>0╘@9╞┼╬#6-╧;╟0@9&5╪#2!┬;╞4@>&╤╧;╫ -(&╔═<"!─;╓┘┼#0╒╞:7┴┘(&%─
  1153. ═8╥!─> ╘@<&┴┴#2!╠9&$@;╓╤─> ╘@96]╥(&-╚=6┘╦#2!╧<╞$@*&)╒9╞9┼<┬─╠
  1154. ═>0╘@<╫1┴("┴┬=69╞97(╔+'─-(&╤─82!├:'5╬:╨╘@<╫1┴(&]╠9'@-('!╠80╘@
  1155. ═:68@:2╤=,2 [=5!$051%╚'─-(&┼╬>0╘@96╤╙90╘@9&5┘#2!╞:6╪-(&1┼> ╘@
  1156. ═8╞┘┼('┴╠;╓]╨#2!╥=',-(#╨\/" @.╓5.1*!/1╩!═04-23┌!84╒1%4 ╘-*┬╚╩
  1157. ═*┬╩@=$%+1:!!╚%-415"@24┌@>0╘->7-╘97 @;6%├#2!╠9'@@9'─@.╓┘534)%
  1158. ═4╩!/1╩!,3╘]0╚$┼415)!5$┼/3┼,-(&)┼<2!─;╓┘┼(#═╔1╩!$63╘╨╚$┼4)╒.@
  1159. ═2┼535*!!╚%!/24┘4#2 ^/├╪@8╓┼╬:70╠9'─-('-┼8╨╒┘;&]╧<"!╨:&$-(&╤─
  1160. ═82!╧;&1╪#2!╧<╞$@*&)╒9╞9┼<┬─╠>0╘@<╫1┴("┴┬=69╞97(╔+'─-('!╠80╘@
  1161. ═:68@:2╤=,0╘@:6┘┘#2!┼;'-┼#2!─97─-(&9╔;@╘@<╓)├(&1╪#2!┬8╓,@9╞┼╪
  1162. ═> ╘@9&5╪#2!┬;╞4@>6╤╧;╫ -9&]╬92!╠9&$@;╓╤─> ╘@;╫)┴("┴┬=69╞97(╔
  1163. ═+'─-('-╘82 ╚8╟5╞9╞5╥*2╤┘#2!╥=',-#69╔>'@@861├(&1┘#2!╠<╫(@;╓╤─
  1164. ═> ╘@<╓5├(" [:4╒03╒)404┘4(0╘@8╞5╤(&9╔>&,-(&1┼> ╘@8╞┘┼('┼╠;╓]╨
  1165. ═#2!╩;7 @9&]╬90╘-9╞┼╪8╥!╨:&$-(&╤─82 ├)#@╨#2!╙=&$@;╓╤─> ╘@96]╥
  1166. ═(&)╒9╞9┼<@╘@<╫1┴(&)╒9╞9┼<@╘@8╞┘┼(&,╥#2!╔;╞,@8╟5╞9╞5╥*╙$-8╙(@
  1167. ═<&╤┴#2!─97@-(&)╬92!┘;&]╧< ╘@:╞╒╨(&1╧;╞4-(#╨\/" @.╓5.1*!/1╩!═
  1168. ═04-23┌!94╒1%4 ╘-*╩!╘04═%╚$%.╚%┬@4╒1%4*!)3╩!42$6@96]╥╚$)51─9%
  1169. ═4@╘╩╚'1(1:!33╘╤%╚$-(04┘'1:!)4┌!43┌!54╘6@96]╥╚$┼.4╒1%042@3╘:@
  1170. ═;╫)┴#0╒┼;╫)╪<╫1┼<"!═86,-(&╤─>"!─>" [;┼5-0─52╚$]&╚$╤/3╒"@251%
  1171. ═4─%424].4╨╘@/├╪^(&-╔;╞┼╘+&1╪#7┴╠;╓]╨(&╤╙<┬!├:'5╬:╨╘@8╞5╤(&9╔
  1172. ═>&,@.╫501$%41:!#3╘╤534╪-('-┬8╥!─>0╘@8╞-├(&9╔>'─@.╫1)346@5$^@
  1173. ═4╒1%4*!)3╩!┘#2!─97@-(&)╬92!╪;&]╧< ╒─;╓┘┼(&╤─82!╧;&1╪(#═╨3$]4
  1174. ═╚%1(1:!,05-4╚$-(54┘+#2!┼;╫(@8╓┴╒;╞╠-(&5╧<┬ ╚8╟5╞9╞5╥*2╤┘#2!╙
  1175. ═=&$@*&)╒9╞9┼<┬─╠>0╘@<╟1╙#0╒╞:7┴├('!╚80╘@;&1┴(&]╠9'@-(&5╧<┬ ╚
  1176. ═8╟5╞9╞5╥*2╤┘(#═╨3$]4#2!╙=&$@*&)╒9╞9┼<┬─╠>0╘@;&1┴(",─9╞8@.╫50
  1177. ═1$%41:!#2%5.2╨╘@<╫1┴(&]╠9'@-('-╘82!├:'5╬:╨╘@;&1┴(",─.# @.╓┼.
  1178. ═0╒)%05-%╚%1(1:!#3╘╤534╪-(&5╧<┬!┬=69╞97(-('-╘82!┬=69╞97(-(&)╬
  1179. ═92!├,@╘@:6┘├(&)╒9╞9┼<┬╠╤#6,╥#2!╨;&$-('-┬8╥!─>0╘@8╞-╙(&-╧;╟0-
  1180. ═(&%─8╥!─> ╘@:68@:2╤=,2 [9$^@5╘6@55-%╚&┼╬>:!/4╩!─97─_#2!╔;╟─-
  1181. ═(&5╠<╓4-(&1┼>0╘@9╞┼╬#6-╧;╟0@9&5╪#2!┬;╞4@>&╤╧;╫ -(&╔═<"!─;╓┘┼
  1182. ═#0╒╞:7┴┘(&%─8╥!─> ╘@<&┴┴#2!╠9&$@;╓╤─> ╘@96]╥(&-╚=6┘╦#2!┼;╫(@
  1183. ═*&)╒9╞9┼<┬─╠>0╘@<╫1┴("┴┬=69╞97(╔+'─-(&╤─82!├:'5╬:╨╘@<╫1┴(&]╠
  1184. ═9'@-('!╠80╘@:68@:2╤=,2 [=5!$051%╚'─-(&┼╬>0╘@96╤╙90╘@9&5┘#2!╞
  1185. ═:6╪-(&1┼> ╘@8╞┘┼('┴╠;╓]╨#2!╥=',-(#╨\/" @.╓5.1*!/1╩!═04-23┌!8
  1186. ═4╒1%4 ╘-#2╩@=$%+1:!!╚%─═4╒1%4*!)3╩!42$6@96]╥+4)51─9%4@╘╩╚&-(
  1187. ═04┘'15.@1┼)/3:!!0─]61:!!4─4┌╚$].3%╞@4$╤/5*!,05-4╚%!!4┼2@3╘:@
  1188. ═14%#2 ╘╩╚%9%4┼1)0╘%,╚$-(54┘++*!$3╘╪╟5*!03$]4╚$╤!4╒2@4$])3┼0╠
  1189. ═╚%!,3╒2@5╘┼42*!┼;╫(-#65╧<╟┼╙=&5╨(&╒┴8╨╘@;&1╪(&1┘(#═╬54╒"15*@
  1190. ═3╘:@3$]/4*!)5$52051)3╘┘3#2!┬97$@9&]╬92 [:4:@1%─],*!)5"=3╚$╔5
  1191. ═4╒2@0:!03╘┼.5 ╘@/├╪^(&-╔;╞┼╘+&1┘#2!╙96,-*╟┼╠;╓]╨╚'!╚80╘╩╚&╤─
  1192. ═8:!╧;&1╪#2╩@;╫)┴╚"┴┬=69╞97(╔+'─-*╩!╙=&&@*&)╒9╞9┼<┬─╠>0╘╩╚'!╠
  1193. ═80╒┘;&]╧<"!╔9┬!╔+%╘╤#2!╔;╟─-(&5╠<╓4-(&1┼>0╘@9╞┼╬#2!╙8╞,@9'@-
  1194. ═(&)├8╥!╞:7┴╪#2!─97@-(&)╬92!┘;&]╧< ╘╩9&]╬9:!╠9&&@;╓╤─> ╘╩╚&]╥
  1195. ═8: ╚8╟5╞9╞5╥*2╤┘#2╩@<╫1┴╚"┴┬=69╞97(╔+'─-9&]╬92!╥=',-#69╔>'@@
  1196. ═861├(&1┘#2!╨:&$@(#═╫1:!/3─╤9╚%!,3╒2@5$┴%╚$╤!4╒2@4$%25*!/1╩!%
  1197. ═04-(╚$-(54┘+#2!╠9&$@;╓╤─> ╘@96]╥("┴┬=69╞97(╔+'─-('-╘82 ╚8╟5╞
  1198. ═9╞5╥*2╤┘#2!╨;&$-(&╤╙<┬!╧;&1╪#2!╙96,@(#═╔35!/4┼1!3┼0┴#2!┬97$@
  1199. ═9╞┼╪8╨╘@9&5╪#2!┬;╞4@>6╤╧;╫ -(&╔═<"!─;╓┘┼#0╒╞:7┴├('!╚80╘@;&1┴
  1200. ═(",─.# -('-╘82!╧;&1╪#2!┼;╫(@8╟5╞9╞5╥#2!╙=&$@8╟5╞9╞5╥#2!┬;╞4@
  1201. ═8╙(-(&┼╬8╥!┬=69╞97(╦,0╒├,┬!╨;&$-(&1┼> ╘@8╞┘┼('┼╠;╓]╨#2!╩;7 @
  1202. ═9&]╬90╘@/#╨\(" [94┘$╚$]&╚&╒!0╒)/╚%┼35$50#2╚╩*┬╩@:4┘)5$┼!3*!,
  1203. ═24┘%╚%-%5%50#0╘╩*╩!╘2$6@0╘]-345.5$5$╚$╤)3─53╚$)%3$]7╚$%21:!.
  1204. ═3╒>@5$%+14┌@0╘%21:!/1╩!"6:!42$4-*┬╩@0╘%,3$┼.1┌!23╒5424┘%+@╘╩
  1205. ═9')┴=┌ ^/├┌@;6]╓92╤╘>#$[>#&@╚#══3╒9%╚%-4549&╚$┼.5$^@6─523┌!0
  1206. ═04=%#2╩@/├╪^╚&╒╧=╞4╠='@╥.╫@╥╚* [=╘┴%4─6@252@0╘%.╚$)%╚$╒/1$┼&
  1207. ═245$#2╩@/├╪^╚&╒╧=╞4╠='─╤.╫─╤#2╩@/├╪^╚&╒╧=╞4╠='─╥.╫─╥#0╒─<╞%╫
  1208. ═(&╤─82!╞:6╤╠#2!┬;╞4@.╟-┼=&5╧<@╘@/├╪^('-┼=&)╒9@╘@:╞╒╨(#╔╙971╒
  1209. ═< ╘┌<╓5╘96]╥(&╤─82 ├/&5╧<╞)╒9┬ [=5-%╚&5╧<╩!"549&15*@24┘35$5!
  1210. ═1*!/1@╘@<╫1┴(&)╒9╞9┼<┬ [1$┼34$╤!6:!"549&15*@1─]2╚$1205=)3─<-
  1211. ═(&╤─82 ├/╞5╧<╞)╒9@╘@<╫1┴(&)╒9╞9┼<┬╠╤#0╘┌<╓5╘=7 @<╓5├(" [;4%+
  1212. ═1:!355)%╚%@╤/%@╥#2!╠9&$@>#(-('-┬8╥!╪,0╘@8╞-╙(#╔├;╓┘╘#2!╠9&$@
  1213. ═>3(@.╓┼&╚$┘/5"╥@4╒=!4*!╨,:!!3─2@<#(-(&╤─>2!┘,0╘@<╫1┴('─╤#2!╙
  1214. ═='─@>3(-(&╤─82!╪,0╘@;&1┘('@╥#2!╙='─@>#$-('-╘82!╪,@╘-('-┼8╨╘@
  1215. ═<╓)├('@╤(#═╬3╒>@83╒$6 ╘┌8╓]╬="!╙=&$@9'@-(&╤─>"!╪,2 [<%54╚%@╤
  1216. ═╚$┼.5$^@>"╥@3─]7╚%=%╚$-!3╩!44─%32*!╪,0╘-8╓]╠=6╒╬('1╪82 [9─┼.
  1217. ═1*!42$6@1─┼24╒2@0╘],54╒.╚$9/4╩!╪#2!╠<╫(-(&╤╙<┬ @.╫1(15)%╚$%2
  1218. ═1:!8,2\╪╚#$╥.*!"651%╚$),3╘-+4╨╘@;'-╥(" [=╘┴)0╘┬@345!3┼.@6#$╧
  1219. ═,3:@,├4╓╚$)95$6@0─╤/0╘═3#2!╠<╫(-(&)├8╥ ┌979┼;┬ [=╘┼42*!!╚%!/
  1220. ═4╒-)0─╤%╚$585%)!╚#$╥.*!"651%╚$),3╘-+#2!╠9'─@(╥0╪," [24:@4╘\╠
  1221. ═╚%-%5*!42$6@2$┼'2*!"250-('-╘>2!┬=69╞97(-(&-╠8╨╘┌979┼;┬!┴9&,@
  1222. ═8╟5╞9╞5╥*╙$@.╓%$1*!)3╩!42$6@3┼5-0─52╚$]&╚#(╒-╩!"651%╚$),3╘-+
  1223. ═4╨╘@<╫1┴(&)╒9╞9┼<┬╠╤#0╘@<╓5├#2!╠9&$@>3(@.╓-!3$-53$%41:!$60╘@
  1224. ═<╓)├('─╤#2!┬8╫,@.╞-╧;╟0╥(#═╔4┌!9,├┘9,3\-(&5╧<┬ ├)&9╞(#═╧5$┴%
  1225. ═4┼=)4╘6@1%─]63$═63(-(&%─8╥ ├)# ╤#3╔├;╓┘╘,┬!╙=&$@9'─-(&-═<"!─
  1226. ═>" [=╘┴/)╒.@0─┼'1╘52.╩!$6:!/4╩!$6#\-(&)├8╥!╙=&5╨:6┘╪(#═╔1╩!$
  1227. ═6"╥@5$┴%3┬╪╬+@╘@:╞╒╨('-╘97!╔;╟─-#7-╘97!╔;╟@@;&1┘('─╤#2!├<'─@
  1228. ═>3(-(&╤─82!┬:71╨+'@@.╫┬@0╒524─5.5$╤9╚$-/3┼1!24┘3╚%@╤#2!╙=&$@
  1229. ═;╓╤─> ╘@<╫1┴(&-╚=6┘╦#2!┬8╓,@>&┼╬8╫─@.╓1/╚%=%╚%-415"@1─]25╘%2
  1230. ═1%.@3╒*@0─%#2╒=!4─13╚$┼.╚'─_#2!╩;7 @>&1┼8╫─-#7┴╔;╞-┘(&╤─82!╞
  1231. ═:6╤╠#2!┬97$@;╞]╥;7┴╔;╞,-(#╪^/┬!┼;╫)╪<╫1┼<"╤╔;╟─-;╞]╥;7┴╔;╞,@
  1232. ═/├╪^('┴╙=&5╨+&┼╬>0╘->&1┼8╫─@;&1┴(&9╔;&╨-(&)┼<2!╬;╫)═>&1┼8╨╘@
  1233. ═/├╪^(&5╧<╟┴╙=&5╨+&1┼>0╒╬;╫)═>&1┼8╥ ^/├╪@>'-╘97 ╠9&5┘#0╒╙=&5╨
  1234. ═:6┘┘(&╤─>2!┘,0╘@;&1┴(&)╔=' ╠>" [>#╒8,0╘@<╫1┴(&]╠9'@-(&╤╙<┬ @
  1235. ═.╫╞@1$]%4╘╪╟5*!54╘6@0╘┴53─═3#2!┼;╫(@;╓╤─>" [<╘^@5╘6@2┼535*!7
  1236. ═04┘4╚%1(1:!"250-('-╘82!╧;&1╪#2!├<'─@>3(-(&)├<╥!┘9&5├>0╘->6┼╬
  1237. ═8╫─@;&1┴(&9╔;&╨-(&)┼<2!╬;╫)═:6┘├#2 ^/├╪@96]╥>7-╘97 ╠:6┘┘#6┘╧
  1238. ═<╞╒╔;╞,@/├╪^('┼╙=&5╨+&┼╬>0╘->61┼8╫─@;&1┴(&9╔;&╨-(&)┼<2!╬;╫)═
  1239. ═9&5├#2 ^/├╪@96]╥>7-╘97 ╠9&5┘#6┘╧<╞╒─96,@/├╪^('┼╙=&5╨+&1┼>0╘-
  1240. ═#2╚═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═#2╩@8╘╤%04┌@55 -
  1241. ═#6-╠96%╬=7 @;&1┴('9═8╫-┬(#═╙5╘┼40╘┬@0╘┴!4╩!23╘╓@0─%#2┌!)3@╘@
  1242. ═86┘─(",┼,3$╤,3 ╤,#$@.╘1%1─%53%0-('-╘82!╓;6-╙8@╘-(')╘<╥ @.╘)9
  1243. ═12$-#2!╘>'0@)╒-024┘!3*!#4─%#2╘52╚"<-('1╪=" ╟4╘╤*╚#8╧.34╟#0╘╩
  1244. ═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+0╘╩╚'-%5*!54*!"252@
  1245. ═5$%"3$4-#2!─<╥!>(#═├3$5!4╩!43┌!%3─2@3╘:@4$%'10╘@(" [<╘^@5$┴!
  1246. ═5*!404),15.@4╒1!4┼2@3╘┌@0:!004=%╚$)/54┘$05)9#6)╔=' @;'5╨(#$╓
  1247. ═(#╠╤,├┬@94┘44─┼%4┌!&3╒*@> ╘@9&9┬("4╤,3$╤,3$╤,0╘@9&9┬("4╨,3$╤
  1248. ═,3$╤,0╘@9&9┬("4╨,#$╤,3$╤,0╘@9&9┬("4╨,# ╤,3$╤,0╘@9&9┬("4╨,# ╨
  1249. ═,3$╤,0╘@9&9┬("4╨,# ╨,#$╤,0╘@9&9┬("4╨,# ╨,# ╤,0╘@9&9┬("4╨,# ╨
  1250. ═,# ╨,0╘@+2╒>#0╒╙:6╪@.╫1!0─╤%╚$]&╚%-)3─53+* ╤,├"@0┼┼415,-8╓]╙
  1251. ═(&5╤=2!╙:6╪╦,3(╪(#═╘04),1:!/1╩!#3╒-)3─53#2 @(#═┬3╒1(╚$]&╚%1(
  1252. ═15-%╚%1224>@5$%"3$53╚$%210╘@(" [0╒524─5.5$╤9╚%-%5*!54*!&4─]-
  1253. ═╚&)┴<╓┼├#7╔─:78@97%╒(&-╧<╥╠╤,├@@.╓1)5─┼324].╚%1!0─╤%#71═871╚
  1254. ═,2!┼<74@>╞1╔=┬╠╙.#0@.╓╒!5$┬@5$%"3$6@3╘:@1┬┴8*3╒8*┼@╧,├4╓#71═
  1255. ═871╚,┬!┼<74@=&╒┴=&@╤*╙4╤,┬ [<╘5#3╘┘$╚$╒!5$┬@5$%"3$4-<&]╠>6╤╔
  1256. ═<╫0@97%╒('1═871╚,┬╠╒,3(@.╓╤)4╒2@3╘:@4$],64=/3┼,-&┴╚:&┴╚:&┴╚:
  1257. 8&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  1258.  
  1259. END
  1260.  
  1261. BEGIN 666 CUBE3D3.2.O
  1262. ═ ("╔ (╘@╘(╘┴╘*╘8╘"─/"1"-&-"@ *─?┴?╬╔@(7\3+╥!─╨41$1$@(" @(" @
  1263. ═(" @(" @0╒5"13-$(%8╙+├(-#2 @(" @(" @(" @(" @(" @($)9#9\@(" @
  1264. ═4╒1%4$┴%3┬!*541$╞2 @("!'14]21╘4@5$%93$]2#0╓;("!#2$5#2╥!/550@
  1265. ═5$┴%($╔!3┬╪@.34@25-3544@3╘8-┼┬ @0╙╒(04-+24┘'╞╥!&3╒(@34]212!$
  1266. ═151!24╤3(0╘-'1╓>$─8╤+╘8╥─┬ ═($┼.0╥]$14,@6"╒23╒1!5$┼/3@╘='1)&
  1267. ═,╥]&-)(@+2!)3─,╧1$5#(%─═4─]4051)3╘╪-'1╘21├4╧1├:2("╘@24┘#+╘1%
  1268. ═0╥!:+5)/5$%424].#1╘=$┬!&-╥ @─┬ ═(%)%4╘54#1╘=$┬ ╦+╥╘@─┬ ═(%╔/
  1269. ═3╘╘@24╪╧3╒54#1╘=$┬ @2" @─┬ ═(%1/1╘=,12!(241$14╪@4╒521─%#15,-
  1270. ═'1╘24╒!!0╘62("╘@5$]'1╘╤%(%-54─9!0╘4@1─┼,3$┼.1╨╘-("!04─534╥!1
  1271. ═(%1/(%%5250-#04@(" @("!04─534╥!!3┼─@2╘59(%1/($)%1╘┼.#0"╤^_ +
  1272. ═(-+_╥-#╓┘╧╤,╧($@┘/_) /#┘╩9*%(╪4┼╩92%)╪4╔╩0&-(="╔─╥#2_┌─ ├2'0
  1273. ═╩4!╔#(7[╩06%_*─ ╚ "┬ !┬1^\┴╔$)#┘&*7[:2┬%^┌7\:0"%_*  ┌(╦@$-#─
  1274. ═╩0"%╚┌─╨┴:2@ *(8╩0"1╚\├0^^:─╥═#╓╩0"%╚┌─╨┴:2% ╩╘8╘"╟╤"0┌-&-"╔
  1275. ═ (57┴5┬%685@┴3^%085 ┴4*%885┬┴6.%9(5┼┴6:%4*─!┴;6╔0(5╤6"#─_\╞%
  1276. ═╘ ╬┼8<─\\%'╞84╨-@\╞)╘ ╞┼8?!$╤╞%,#8/)┴═ +╔6+)// ╒┘╞),#8/)┬═ )
  1277. ═╔6+╨*,9┬3 ╓#╥8?0"┌5├╥3╙╨&>9├3 ╓#╥8╧0":5├\ ╙&8╘╨-@\╞(╘ 9,1╚),
  1278. ═#8/)*] '┘╟'╞<4╨-@\─═╘ ╫&<<9╤$"├╞<>9╤3 ╓#╥4├0":6╒20&%═4╨-@\─@
  1279. ═╘ ╞┼4$─!┴5!,#8/)4= #3)╞.>!┬┼9&5┴╥7┬0 ╬┼╪┴608╔65┼8╠┼╪─ +╔>(5┼
  1280. ═&*5╞96/)>) "┌7┬%9├┬┼9>5╞╠ )╔>(5╟&*5┼96;)>) "┌7┬%:!┬┼9&5╞╥7┬0
  1281. ═ ╬┼╪┴6─╪╔63┼9╦ ":7┬%:┴┬┼9&5╚╥7┬0 ╬┼╪┴6╠╪╔63┼9[ ":7┬%;!┬┼9&5╟
  1282. ═╥7┬0 ╬┼╪┴6╘╪╔6├┼9+ ":7┬%;├┬┼9>5─╠ )╔>(5╧&*5─967)>) "┌7┬%<!┬╞
  1283. ═9[╘ ─*9╚?0"0┴:6╞9[╓ ├╙┬╞:/╓ ├╪6╞╔╞6]@(\0#┴┴)_╓─!"┴┴)_╓─!3-╓#
  1284. ═"╚6╟.*9╬╧0"0╔╞╫] ) ╪╔╞╧] ) 8╔╞╤] ) 0#┴┴)_╓─!2┴┴)_╓─!3 >$2┴┬╞
  1285. ═:7╓ ├╙┬╞:╧╓ ├╪6╚.*9╦╧8"/╔╞╙]@(\╪╔╞╫]@(\╪╔╞[]@(\0#┴┴)_╓─!2┴┴)
  1286. ═_╓─!3#╓$2┴┬╞:7╘ ─!┬╞:╟╘ ─(6╔╔╞^]@(\╪╔╟#]@(^%╩╩9╠╧8"/.*9╬_8"/
  1287. ═.*9═_8"/.*9╦_8"/$ ╪82?]╔ 4╚82?]╔ 4╥ ┴$╚8╔╞╔] ) ╪╔╞╟] )"%╩╤┬╞
  1288. ═;+╘ ─*9═?0"0.*9╦_0"0.*9╬_0"0$ ╪82?]╔ 4╚82?]╔ 4╥╓┴$╚8╔╞┼]@(\8
  1289. ═╔╞╔]@(^%╦!┬╞;[╘ ─*9╨?0"0┴:╓╔ (6├╔0*%╔*((╩0"@ )&├╥-#[┘╩3*╘/2@
  1290. ═ (11╔%&┘ );0 ╘╥*┴852┘┼$@╤86┼5╘╔*2╚57╤3^╨ ╚4_╔5╟%0; "┴4&┼6$╔*
  1291. ═2╚58╤4"0 ╚5 ╔6#%0╔ "┴4*┼4/#!╩0"%╚┌4"┴:2╔ (7[╩4"%_*572╔ '╚("$
  1292. ═╚╪3[&(5╚9:2%╔*5╚9?╥%_*58..57╩╬┬─8- "┘╞"─8*─ 4?═(4:.1╚┌─ ─?═╚
  1293. ═┬,19╠.^┼╚╘╞ ┴:.%^] $┘╩3╞_,╦0╓─╙═┴*╘8╘$─"├1├0╩0┴% ╚4"3&┌"9╘5%
  1294. ═(&)204┼.+"!72$%4($1/(%┼/52!704┘4(%1/($1/(%1/3─┼'2%0_╩0"%8(58
  1295. ═╩?^%6857╔%&┘ ):%─╠┬┘ ):%─\┬┘ ):%┼,├&4╦─ ┼╚65╥+─ ┼╚66╥+─ ┼╚6╬
  1296. ═╥,92╬0"6┴:_(╬0"6┴;#(╬0"6┴;'(┴%&──╩6┼┴2882?]╔ 84╚╠28╪\2┬%╠╩6╚
  1297. ═┴2882?]╔ 84╚╠28╪\2┬%╠┌6╦┴2882?]╔ 84╚╠28╪\2┬%═*23╔::%)┴┴)_╓─!
  1298. ═┴2┬╤)├├╤*!┴┼╠╚6╥╔:╞%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╪6╙╔:╥%)┴┴)_╓─!┴2┬╤
  1299. ═)├├╤*!┴┼═(6╘╔)2┼╔╪4╞&$╟_:0&%*+$╞./$╚&&6╥┴;*┼╩╚4╞&$╟_:0&%*+$╞
  1300. ═./$╚&&6╙┴;.┼╦84╞&$╟_:0&%*+$╞./$╚&&6╘┴92╩╧("0╔;*%(┴┴)_╓─!┴22╤
  1301. ═(├├╤)*9╤╪$#╨%(3[╔'&%)┴┴)_╓─!┴2┬╤)├├╤**3[&&┼ ┴9+%5[ "┴5?%6) "
  1302. ═┴5┬┼╠╪4┬&$╟_:0&%)+$┬./$─╪$#╨$*1╤┴2882?]╔ 84╚╠28╪\2@8:4"%─\59
  1303. ═╠ *%6<5@─ *%8*25╔:6%)┴┴)_╓─!┴2┬╤)├├╤*(6╥╔:┬%)┴┴)_╓─!┴2┬╤)├├╤
  1304. ═*(6╙╔:╬%)┴┴)_╓─!┴2┬╤)├├╤*(6╘╔):┼╔╚4╞&$╟_:0&%*+$╞./$╚&&6╥┴;*┼
  1305. ═╩84╞&$╟_:0&%*+$╞./$╚&&6╙┴;.┼╦(4╞&$╟_:0&%*+$╞./$╚&&6╘┴;2─╦╩6╟
  1306. ═┴2882?]╔ 84╚╠28╪\2@89;*%╠╩6╩┴2882?]╔ 84╚╠28╪\2@89;.%╠┌6═┴288
  1307. ═2?]╔ 84╚╠28╪\2@89;2%╦╩╩\@)"┼╠╚4┬&$╟_:0&%)+$┬./$─╔╟'@0/ 4┴/╬─
  1308. ═<84╞&$╟_:0&%*+$╞./$╚╔/╠8:4"%┼<57╠ *%5\58─ *%6*6╙┴2(82?]╔ 84─
  1309. ═╠2(╪\23@0/ 0╔'&%)┴┴)_╓─!┴2┬╤)├├╤*!┴╔0(66╤5╞╨ ╚59╤6"0 ╚5@╔*^┼
  1310. ═╔84╞&$╟_:0&%*+$╞./$╚┴;*┼╩(4╞&$╟_:0&%*+$╞./$╚┴;.┼╩╪4╞&$╟_:0&%
  1311. ═*+$╞./$╚┴;2─╠*6╞┴2882?]╔ 84╚╠28╪\2@89;*%╠╩6╔┴2882?]╔ 84╚╠28╪
  1312. ═\2@89;.%╠┌6╠┴2882?]╔ 84╚╠28╪\2@89;2%═*2╤╔:>%)┴┴)_╓─!┴2┬╤)├├╤
  1313. ═*!┴┼╠╚6╥╔:╩%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╪6╙╔:╓%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼
  1314. ══(6╤╩╦╥ ─*6╥┴2(82?]╔ 84─╠2(╪\22╞<>! \!2$^┌1╤┴2882?]╔ 84╚╠28╪
  1315. ═\2┬─^╤┴╔0(6╧╤5>╨ ╚57╤5┬0 ╚58╔;.%(┴┴)_╓─!┴22╤(├├╤).! \!"─<84╞
  1316. ═&$╟_:0&%*+$╞./$╚&&┼ ┴;#%6; "┴5╟%8) "┴6"┼═?!'╔94╪┘9*╚╔; ╪┘9:%
  1317. ═)┴┴)_╓─!┴2┬╤)├├╤*(7[╔:\╪┘96╚╔98╪┘9.%)┴┴)_╓─!┴2┬╤)├├╤*,7[, _&
  1318. ═4╧ *┘┼'╞4>91╤┼+0]╞"┼─╚7[╔9.%_*65┴?╓┼┼╚7^(-"+╔96%^┌66┴?╥┼╦╪7]
  1319. ═╔;"%_┬#0┬\92╘ -,=╪╬─4;─ ┼╚65╥+─ ┼╚66╥+─ ┼╚6╬╥(11╔)6┼╔84╞&$╟_
  1320. ═:0&%*+$╞./$╚┴;*┼╩(4╞&$╟_:0&%*+$╞./$╚┴;.┼╩╪4╞&$╟_:0&%*+$╞./$╚
  1321. ═┴;2─┼╩6╞┴2882?]╔ 84╚╠28╪\2@89;*%╠╩6╔┴2882?]╔ 84╚╠28╪\2@89;.%
  1322. ═╠┌6╠┴2882?]╔ 84╚╠28╪\2@89;2%═*2╬╔:>%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╚6╥
  1323. ═╔:╩%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╪6╙╔:╓%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼═(6╬╩╦╥ 
  1324. ═─*6╥┴2(82?]╔ 84─╠2(╪\22╞<>! \!2$^┌1╤┴2882?]╔ 84╚╠28╪\2┬─^╤┴╔
  1325. ═0(65╤5>╨ ╚57╤5┬0 ╚58╔;.%(┴┴)_╓─!┴22╤(├├╤).! \!"─<84╞&$╟_:0&%
  1326. ═*+$╞./$╚&&┼ ┴9;%6; "┴5╟%8) "┴6"┼┼87[╔9:%_*6╧┴?╓┼╠(7^(-"+╔96%
  1327. ═╦┌66┴;#&4╧ #3!&*╔9*%_:63┴?┌┼╦╪7[╔;"%_"#0┬╓!╙04╒%(%1(24┘'(%=%
  1328. ═($1/($5615)9($┘)1╘┴4+"!╨24┘+63╚@5%)9(%1/(%1!2╘4@3╒9%4┬!42$4@
  1329. ═5╘]23$0┴;─%21┬&┼4- +╩0"%╚┌4"┴:1,┘╪╬╔ (6├╩4"%╔#┬┼_>7[╠!.┼_╩3\
  1330. ═┴?╥$_╩7[╔/╓$^╪7]..7[┴6>╞^╪╔*2─╔*─ 6@@(2├&&6─┴:0╪╔?[┼_+ $2?]╔
  1331. ═ 85╚╤6>0 ╘╥-├:3\╤/┌] (^%_87^─ -,╪╪╥┼4/!3╔╞>┼9╘╔&_╧ 0┘6┬0,<╦0
  1332. ═]:7]1?┘1╚┘&├8$┬┼_5&├─:.╔_╪7]┴?┌╔@$6├┴:/0 ╬:─:.5╚╠ -┼9\├*╘,╔,
  1333. ═38╤┼9╘┬┼_47^4:.1╚┌7^┴?╒╚╥,╦0╠╓"╞9┌5╟2─;^\!#┼:) ╤╥═#╒╔?╒%_┴&├
  1334. ═─:-@2*7]$:.1╚┌╟_┴?╓%_╩╞ 1:.%╚] "┘╩1╚┘6┬╨ ╓5╟╥,╦0╥─╥@├&5╟2*7]
  1335. ═1?╪1╚┘&├╔?┌%_6├(╥═"╙8*50\%.╞9┌5╟2─;^\!#┼:) ╤╥═#╒╔?╒%_┼&├─:-@
  1336. ═2*7]4:.1╚┌╟_┴?╓%_╩╞ 1:.%╚] "┘╩1╚┘6┬╨ ╓5╟┬,╦0╥─╙╫├&5╟2*7]1?┘1
  1337. ═╚┘&├╔?┌%_6┬(╥═"╙8*9╟╔6=*1╧[╨$.5╚─#'*╘/6┼_47^$:.1╚╓!(╔?╘1╚┘&├
  1338. ═╩?^%_87^╩8!%╚╪6├╘ +╞╔&├┼:+ #96>(╥═#*3$╩-96=(╔?╒%_┴&├─:.┼_╚7]
  1339. ═:(├*╘+-@╔/╥] (^%_4╔%_87]╤/┌╨?╩50\#╩╞:/ ,╔6┴*.,├┼9┘ $╥═#╪8&5╚
  1340. ═2*7]4:.1╚╓┴&_3├╨!╠╦0┘4╥╤├4┬╔@(7]1:.%╚] "┘╩1╚╥═#13+&-╔╞├╨%*5╚
  1341. ═2├┴(╔?╘1╚┘&├:,├┼9┘ *╥═#╨╔?╘1╚┘&├8&5╚1╧╘╪\ ;*╘-],\╪╒(╩8"%_46├
  1342. ═┴:/0 ╬:─:,╦0╥╘╙╙├:50\#╩╞:/ ,╔6┴*.(├┼9┘ $╥═#╪8&5╚2*7]4:.1╚╓┴&
  1343. ═_3├╨!╠╦0┘4╨╧├─┬╔@(7]1:.%╚] "┘╩1╚╥═#13"^.╔╞├╨%*5╚2├┴(╔?╘1╚┘&├
  1344. ═:(├┼9┘ *╥═#╨╔?╘1╚┘&├8&5╚1╧╘╪\ ;*╘-],<8┘(╩8"%_46├┴:/0 ╬:─:,╦0
  1345. ═╥╘╤╤├╩╘8╘"╟╒├1├08%-024┘!3"!#4─%#2╘52(%-,2┬ ╓+╙─╒            
  1346. ═                                                            
  1347. ═                      #_?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_?╙\?
  1348. ═#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_
  1349. ═?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\'
  1350. ═ ╨'_?╙\?#╨<# 1╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  1351. ═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  1352. ═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  1353. !&┴╚:
  1354.  
  1355. END
  1356.  
  1357. BEGIN 666 SHAPE3.2
  1358. ═ 1╨┴'   ├╥!#54)%,╘0@4╘┴!4$4@24┘)5"!04─]'4─%- $<<!0"7-3$╠,├4╒
  1359. ═.╔<╒,┬╨╤,├<┌┼╙4╒+#(╒-3╩7-38╠,3(╫.╔╨ ;┴╤┬ (\@34%)3┬!04─]'4─%-
  1360. ═(%-405)44╥!!5"!,24┘%(#4╨,#  =!╤├ #╚ ┬!╤─ (\@4%)/1╒)!32!.3╒1%
  1361. ═4╨":'&╪ ├╥!33$╚@-┬\╤-┬\┘-0"╨''@ ├╥!$051!($9/4─╒!5"!)4╙╚ ╒┴╤]
  1362. ═ (\@3┼5-4$])3┼13+%@╤+%─╤+%╚╤+%@╥+%─╥+%╚╥+"╪╬+@#╫'(( ├╥!42$4@
  1363. ═4$],64=/3┬!,25-4("╔-55-4*┬!"10 5'8< ├╥!415)-24┘!5$5$(%=)5$@@
  1364. ═02!:15)/(0 ;'8─ .@ ^'8╨ ├╥!/1┬!#3╒524╘4╠(%1(15)%($┼3($$@3$]4
  1365. ═($]& %╪=─0"/($154$╤)0╘%424].($1205=)3─<@3$┼.15, @╤╓3 (\@5╘┴%
  1366. ═3┬!&04-%4╥!!4─5.)╒0@0─5)3─<@1─┼,3$5$ *8=┼@"/($$@1─%35"!04─]'
  1367. ═4─%-(%=/54╤$3┬=4($1205< ╥┴╓@ (\@5$┴%(%-!344@3$┼.12!45╘┼#12╨@
  1368. ═0┼54(%1(25, ┌!╓┼ (\@25,@1╘]/1"!%3─]51╘@@1─]2($┘/5╥$ "┴┌╟ (\@
  1369. ═3╘8@0╘]54┼-%+"!&3╒(@1─┼,3$5$($9!0╘53 "╠>╩ "/(%1(25,@25,@3─\@
  1370. ═3$].1╘52($%.($┼34╒5% #$>╩@ ┌ %8>═ "/($9%14╨@1┼)%12!43╥!0550@
  1371. ═64]54┬!/5╘╪@1$%400!\'╦─ ├╥!)3┬╨@0┼54($-(04┘'12!42$4@4$]+12!)
  1372. ═3┬!,24┘% )@>╧@"/(#4╨,#4@5$\@55-%($,╤($%.1"!#,@">'╠@ .@##'═( 
  1373. ═├╥!33╒)262!!0─]55"!33╘╒%($]&(%1(12!,25143$4 ╫┴[7 (\@0┼5'4╥╨@
  1374. ═15(╬+┬╪@1─5!5%5215, _┴[< (\@5$┴)4╥!705,@02!214%,(%)54╘@@2─]"
  1375. ═+@ $'^8 .@ ╟'_  ├╥!!3─0@248@64]5($9%14╨@4╘\@24┘#3$┼.140╠ $0?
  1376. ═^@"/(%=2251%(%1/(%-*541$0$┘752┘%1%4 2┴\$ 3╚ :1\. 8\@04┘$($%"
  1377. ═3╒9%($%,3"╨@2$%612!&54╪┴ &\?& $┌ ($?┘@./($9)4┼-4(%-(05!% )<?
  1378. ═┘╨-!,;+"*#8╤*3╔!,╦+"*#8╥*0#''^@#@╥ ╘+"╘╥-┬╨═,├8╠-├0╠,├8╠+3(╓
  1379. ═+#8╘+#(╓+#8╘+#8╘+"╘╥-┬╨╓-"╨╓- #╙'_(#@╥ ╘+"╘╥-┬╨═,├8╠,"╨╥-┬╨═
  1380. ═,├8╠,"╨╥-┬╨╓-"╨╨+"╘╥-┬╨╓-"╨╨ !<@_ .#(#,╠,"╨═,├8╠,╙(╠,38╠,╙(╠
  1381. ═,╙(╠+3$╓+#,╥+#,╥ !\@!@2#(#  ,┬!*!(\@4╘5#3╘┘$(%-(05!% $@@2╨1"
  1382. ═,;+"*#8╤*3╔",╦+"*#8╥*0!\($╨$@╥ ╘+"╘╤-2╨╙,"╨═,3(╠+3$╒+"╘╙,"╨═
  1383. ═,3(╠+34╫+"╘╙,"╨═,╥╨═-3$╠+38╠+3, ╦"!6!(,@-"╨╤-2╨╙,"╨═,3(╠-3$╠
  1384. ═+38╠+3,╠-3<╠+3,╨+"╘╙+#$╒+"╘╙,"╨═,3( ╪"!@!(,@-"╨╤-2╨╙,"╨═,3(╠
  1385. ═,34╠+3,╨+"╘╤,┬╨═,34╠+3,╨+"╘╤,┬╨═,34╠,╙ ╠+3$╥ "0┴:@2#(#<╠,34╠
  1386. ═+3,╨+"╘╤,┬╨╒-╥╨═,╙ ╠+3,╠,╙,╠+3,╨+#8╠,"╨═,╙ ╠,3(╠+3,╙+"╘╙,"╨╓
  1387. ═+"╘╒-╥╨═,╙ ╠+3, -┬%╠!(,@+3$╒+"╘╙,"╨═,3( 6╥%╘!(,@,╥╨╙,╥╨═,╙ ╠
  1388. ═,"╨╙,╥╨═,╙ ╠+30╠,╙─╠+3,╨+"╘╥ (,┴?@2#(#,╠+3,╙+"╘╙,"╨╨+"╘╙.2╨═
  1389. ═,╙ ╠+3(╠+3,╙+"╘╙,"╨═- "╧(8@$@╥ ╘+#8╠+3,╨+#,╠-┬╨═,╙ ╠+38╠,3@╠
  1390. ═+3,╨+"╘╘+#$╪+"╘╙,"╨╤ -\┴─@2#(#0╠+38╠+3,╨+#,╠+3$╪+"╘╙,"╨╤+"╘╤
  1391. ═."╨═,╙ ╠+30╠+38╠+3,╨+"╘╓  <┬╟ 2#(#,╠+34╫+"╘╙,"╨═,╥╨═,╙,╠+3,╨
  1392. ═+#8╠+34╤+"╘╤,┬╨═,╨ ╧(╩8$@╥ ╙+"╘╙,╥╨═,╙ ╠-┬╨═,34╠,╙ ╠+3$╥+"╘╒
  1393. ═,2╨═,3(╠+3, 4╥*╨!(,@,╥╨═,34╠,╙ ╠+3$╥+"╘╙,╥╨═,╙ ╠-┬╨╨+#8╠,3( 
  1394. ═=2*┌!(,@,╥╨╨+#8╠,3(╠+3,╙+"╘╙,"╨╓+# ╠+3,╨+#$╥ )─┬╤ 2#(#,╠,34╠
  1395. ═,╙ ╠+3$╥+"╘╤-2╨╙,"╨═,3(╠,"╨╓+#$╥ +╚┬╙@2#(#,╠,"╨═,╙ ╠,3(╠,╙,╠
  1396. ═+3,╨+#8╠,"╨╓+#$╥ -╨┬╓ 2#(#,╠,"╨╓+#$╥+#,╙+"╘╙,"╨╓+#$╒+#,╨+"╘╤
  1397. ═,@ !(^($@╥ ╙+#$╒+#,╨+"╘╤,┬╨╙,╥╨═,╙ ╠-┬╨╒,2╨═,3(╠+3, )┬/╠!(,@
  1398. ═,╥╨╙,╥╨═,╙ ╠-┬╨╒-╥╨═,╙ ╠+3,╠-3$╠+3$╥+"╘╙ "╪├]@2#(#  0",2!8\@
  1399. ═5$┴)4─0@4╘┴!4$4 5┬,3!4,╤╠╠(╚-├$╔.─,╥╠╠(╚-├(╔ ' ├% 6/(%┼/55(@
  1400. ═1$%402!'3╘53($┴%4─4 >"/0!╪,@, ",(╪@30┼"╥,├4╓╦"@┘╦#$╓╩├8╔ + ├
  1401. ═├!./($-(04┘'12!"14╤/5╥!43╥!03╘┼.5"!43╥!$051! ,(├├1.7-├4╠0├$┌
  1402. ═┼╙8╓+$(╥ .$├─┴.'3├╩70┼ ╠3├╔"4+)"4*╚╤.╚═.╠├"╟-3 ╒, #╔(┘<3╞2!.
  1403. ═  8─╟!.!2;(╤╔#.╠3├╩'4#╩+4+,╨╔╒"╥,├4╓╩┼  &"2╞$┘="4"╤0.─)0╠─)0
  1404. ═╩├$ (┬2╦$┘─┬+┬([ "╪─╠!.".╚─╒,#$╨ #\─╬┴.>,╙(╫-├@┌╟#╩,.╚     :
  1405. ═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  1406. 0&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  1407.  
  1408. END
  1409.  
  1410. BEGIN 666 TABLES$8F80-$95FF
  1411. ═@(\  @,%!╨@*"╨╘/$!$3%!47&!─:&╤╨='1╪>'╤\@(" @(" @'╤\>'┴╘='!╠:
  1412. ═&1@7%103$1 /#0╠*" <% ╨( _╧╫[^?├╓]?/╤\._═[.╧╔┌.?╞┘>3├╪^+┬╪>'@
  1413. ═╪.#@╪.#@╪>'┬╪╬/├┘.7╞┘^├╔┌^╙═[_#╤\_7╓^/╟[_?╪ _╨    #_\" @(" ?
  1414. ═'╤╪>'1╘<&╤╚9&!<5%!,1$ \-"╨╚(!╨4# @#^_?╧┘^/;╒\_'╨[^╫╠┌^╟╚┘^;┼
  1415. ═┘./├╪╬+┴╪>#@╪.#@╪.#┴╪>+┬╪^/─┘>;╟┌.╟╦[.╫╧\/'╙]?;╪^?╧]_@ " ╨4'
  1416. ═" ╚+#0\0$1,4%1<8&1╚;'!╘='┴╪?'╥ @("  _____╨  (┬(┬(┬(├(╥,├(╥,├
  1417. ═(╥,─)"0─)"0─)"4┼)24┼)24┼)┬8╞)┬8╞)┬8╟)╥<╟)╥<╟*"@╚*"@╚*"─╔*2─╔
  1418. ═*2╚╩*┬╚╩*┬╠╦*╥╠╦*╥╨╠+"╨╠+"╘═+2╘═+┬╪╬+┬╪╬+╥\╧+╙ ╨,# ╨,3$╤,3$╥
  1419. ═,├(╥,╙,╙,╙0╘-#0╒-34╒-├8╓-├<╫-╙@╪.#@8&!@8&1─9&1─9&1─9&1─9&1─9
  1420. ═&1─9&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╠;&╤╠;&╤╠;&╤╠;&╤╠;&╤╨<'!╨<'!╨<'!╨<
  1421. ═'!╨<'1╘='1╘='1╘='1╘='1╪>'┴╪>'┴╪>'┴╪>'┴\?'╤\?'╤\?'╤\?(" @(" @
  1422. ═(" @(" ┴(2$┴(2$┴(2$┴(┬(┬(╧__     /____\ \   _╨#__╨    #_____
  1423. ═     /____\     _____╨    #_ /__     /_╨__\     _____╨    #_
  1424. ═____     /____\     _____╨    #_____     /____\     _____╨  
  1425. ═  #_____     /_╨                 0$! 0$! 0$" @(" @(# ╨,#! 0$
  1426. ═! 4%!04&!@8'!╨<(" @)"0─*"@╠+"╨╨,#0╘.#@\/$! 1$1(2$╤,4%!45%┴<7
  1427. ═&!@9&┴╚;'!╨='┴╪?(" ┴(┬,├)"4╞)┬<╚*2─╩*╥╨═+┬╪╧,#$╥,╙0╒-38╫.#─┌
  1428. ═.╙╨]/├] 04)#1$5&1╘┴)2─═-3─]045)35%976"╠╩*2─╚)╥8╞)20├(╥(┴(" ?
  1429. ═'┴╪='!╨;&┴╚9&!@7%╤85%104$╤,2$┴$1$! /#╨╪.#0╘,# ╠+"╨╚*"0─)" @(
  1430. ═!╨<'!@8&!04%!00$! 0# ╨,# @(" @(" 0$! 0$! 0$                 
  1431. ═              $! 0$! 0$! @(" @(" ╨,# ╨0$! 0%!04%!@8&!╨<'" @(
  1432. ═"0─)"@╚+"╨╠,# ╘-#@╪/#╤ 0$1$2$┴,3%!05%187%╤@8&1╚:&╤╨<'1╪>'╥ @
  1433. ═(2(├(╥0┼)┬8╟*"─╔*┬╠╠+2╪╬+╙ ╤,├,╘-34╓-╙@┘.├╠\/3╪_0$%"0╘1%1─=(
  1434. ═24╔+34┘/4%%24╒165╒@╦*┬─╔*"<╞)┬4─(╥,┬(2 @'╤╪>'1╨<&╤╚:&1@8%╤<6
  1435. ═%144%!,3$┴(1$1 0#╨\.#@╘-# ╨+"╨╠*"@─)"0@(" <'!╨8&!@4%!04$! 0$
  1436. ═ ╨,# ╨(" @(" @$! 0$! 0$!                               ! 0$!
  1437. ═ 0$! 0(" @(" @,# ╨,$! 0$!04%!08&!@<'!╨@(" ─)"0╚*"╨╠+# ╨-#0╪.
  1438. ═#╨\0$!$1$┴(3$╤04%146%╤<8&!─:&┴╠<'!╘>'┴\@("$┬(╥,─)28╞)╥@╔*2╚╦
  1439. ═+"╘╬+┬\╨,3(╙-#4╒-├<╪.3╚[/#╘^/╘ _/├╘\.╙╚┘.#<╓-34╘,╙(╤,"\╬+┬╘╠
  1440. ═*╥╚╔*2@╟)┬8┼)",├(┬$@(!\>'┴╘<'!╠:&┴─8&!<7%┴45%!03$╤(2$1$0$ \/
  1441. ═#@╪-#0╨,"╨╠+"@╚)"0─(" @'!╨<&!@8%!04%! 0$! ,# ╨," @(" @(! 0$!
  1442. ═ 0$! 0                               0$! 0$! 0$" @(" @(# ╨,#
  1443. ═! 0$! 4%!04&!@8'!╨<(" @)"0─*"@╠+"╨╨,#0╘.#@\/$! 1$1(2$╤,4%!45
  1444. ═%┴<7&!@9&┴╚;'!╨='┴╪?(" ┴(┬,├)"4╞)┬<╚*2─╩*╥╨═+┬╪╧,#$╥,╙0╒-38╫
  1445. ═.#─┌.╙╨]/├] /╙╪]/#╠┌.3@╫-├4╒-#,╥,3 ╧+┬╪═+"╠╩*2─╚)╥8╞)20├(╥(┴
  1446. ═(" ?'┴╪='!╨;&┴╚9&!@7%╤85%104$╤,2$┴$1$! /#╨╪.#0╘,# ╠+"╨╚*"0─)
  1447. ═" @(!╨<'!@8&!04%!00$! 0# ╨,# @(" @(" 0$! 0$! 0$             
  1448. ═ !╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  1449. ═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  1450. ┼&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
  1451.  
  1452. END
  1453.  
  1454.  
  1455. ********************************
  1456. *└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
  1457. *└╙TEPHEN└╩UDD└└└└└└└└└└└└└└└└└*
  1458. *└╟EORGE└╘AYLOR└└└└└└└└└└└└└└└└*
  1459. *└╙TARTED:└7/11/94└└└└└└└└└└└└└*
  1460. *└╞INISHED:└7/19/94└└└└└└└└└└└└*
  1461. *└V2.0└├OMPLETED:└12/17/94└└└└└*
  1462. *└V3.0└├OMPLETED:└3/20/95└└└└└└*
  1463. *└V3.1└├OMPLETED:└6/14/95└└└└└└*
  1464. *└V3.2└├OMPLETED:└6/15/95└└└└└└*
  1465. *└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
  1466. *└╫ELL,└IF└ALL└GOES└WELL└THIS└└*
  1467. *└PROGRAM└WILL└ROTATE└A└CUBE.└└*
  1468. *└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
  1469. *└V2.0└+└╬EW└AND└╔MPROVED!└└└└└*
  1470. *└╬OW└WITH└FASTER└ROUTINES,└└└└*
  1471. *└HIDDEN└SURFACES,└FILLED└└└└└└*
  1472. *└FACES,└AND└EXTRA└TOP└SECRET└└*
  1473. *└TEXT└MESSAGES!└└└└└└└└└└└└└└└*
  1474. *└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
  1475. *└V3.0└+└╞AST└CHUNKY└LINE└└└└└└*
  1476. *└ROUTINE.└└└└└└└└└└└└└└└└└└└└└*
  1477. *└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
  1478. *└V3.1└+└╟ENERAL└POLYGON└PLOT└└*
  1479. *└WITH└HIDDEN└FACES└(╪-PRODUCT)*
  1480. *└AND└ZOOM└FEATURE.└└└└└└└└└└└└*
  1481. *└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
  1482. *└V3.2└+└┼╧╥-BUFFER└FILLING└└└└*
  1483. *└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
  1484. *└╘HIS└PROGRAM└IS└INTENDED└TO└└*
  1485. *└ACCOMPANY└THE└ARTICLE└IN└└└└└*
  1486. *└├=╚ACKING,└╩UN.└95└ISSUE.└└└└*
  1487. *└╞OR└DETAILS└ON└THIS└PROGRAM,└*
  1488. *└READ└THE└ARTICLE!└└└└└└└└└└└└*
  1489. *└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
  1490. *└╫RITE└TO└US!└└└└└└└└└└└└└└└└└*
  1491. *└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
  1492. *└═YSELF└WHEN└YOUNG└DID└└└└└└└└*
  1493. *└EAGERLY└FREQUENT└└└└└└└└└└└└└*
  1494. *└─OCTOR└AND└╙AINT,└AND└HEARD└└*
  1495. *└GREAT└┴RGUMENT└└└└└└└└└└└└└└└*
  1496. *└└┴BOUT└IT└AND└ABOUT:└BUT└└└└└*
  1497. *└└EVERMORE└└└└└└└└└└└└└└└└└└└└*
  1498. *└├AME└OUT└BY└THE└SAME└─OOR└└└└*
  1499. *└AS└IN└╔└WENT.└└└└└└└└└└└└└└└└*
  1500. *└└└└-└╥UBAIYAT└└└└└└└└└└└└└└└└*
  1501. *└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
  1502. *└╘HOUGH└╔└SPEAK└WITH└THE└└└└└└*
  1503. *└TONGUES└OF└MEN└AND└OF└ANGLES└*
  1504. *└AND└HAVE└NOT└LOVE,└╔└AM└└└└└└*
  1505. *└BECOME└AS└SOUNDING└BRASS,└OR└*
  1506. *└A└TINKLING└CYMBAL.└└└└└└└└└└└*
  1507. *└└└└-└1└├ORINTHIANS└13└└└└└└└└*
  1508. *└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
  1509. *└╨.╙.└╘HIS└WAS└WRITTEN└USING└└*
  1510. *└└└└└└═ERLIN└128.└└└└└└└└└└└└└*
  1511. ********************************
  1512.  
  1513.  ╧╥╟ $8000
  1514.  
  1515. *└├ONSTANTS
  1516.  
  1517. ┬╒╞╞1 ┼╤╒ $3000 ;╞IRST└CHARACTER└SET
  1518. ┬╒╞╞2 ┼╤╒ $3800 ;╙ECOND└CHARACTER└SET
  1519. ┼╧╥┬╒╞ ┼╤╒ $4000 ;┼╧╥-BUFFER
  1520. ┬╒╞╞┼╥ ┼╤╒ $┴3 ;╨RESUMABLY└THE└TAPE└WON'T└BE└RUNNING
  1521. ╪1 ┼╤╒ $╞┬ ;╨OINTS└FOR└DRAWING└A└LINE
  1522. ┘1 ┼╤╒ $╞├ ;╘HESE└ZERO└PAGE└ADDRESSES
  1523. ╪2 ┼╤╒ $╞─ ;DON'T└CONFLICT└WITH└┬┴╙╔├
  1524. ┘2 ┼╤╒ $╞┼
  1525. ╧╠─╪ ┼╤╒ $╞─
  1526. ├╚╒╬╦ ┼╤╒ $╞┼
  1527. ─╪ ┼╤╒ $67 ;╘HIS└IS└SHARED└WITH└╘1└BELOW
  1528. ─┘ ┼╤╒ $68
  1529. ╘┼═╨1 ┼╤╒ $╞┬ ;╧F└COURSE,└COULD└CONFLICT└WITH└X1
  1530. ╘┼═╨2 ┼╤╒ $╞├ ;╘EMPORARY└VARIABLES
  1531. ┌╘┼═╨ ┼╤╒ $02 ;╒SED└FOR└BUFFER└SWAP.└└─ON'T└TOUCH.
  1532. ┌1 ┼╤╒ $22 ;╒SED└BY└MATH└ROUTINE
  1533. ┌2 ┼╤╒ $24 ;─ON'T└TOUCH└THESE└EITHER!
  1534. ┌3 ┼╤╒ $26
  1535. ┌4 ┼╤╒ $28
  1536. ╦ ┼╤╒ $┬6 ;├ONSTANT└USED└FOR└HIDDEN
  1537.    ;SURFACE└DETECTION└-└DON'T└TOUCH
  1538. ╚╔─┼ ┼╤╒ $┬5 ;┴RE└SURFACES└HIDDEN?
  1539. ╞╔╠╠ ┼╤╒ $50 ;┴RE└WE└USING└┼╧╥-FILL?
  1540. ┴╬╟═┴╪ ┼╤╒ 120 ;╘HERE└ARE└2*PI/ANGMAX└ANGLES
  1541.  
  1542. *└╓╔├
  1543.  
  1544. ╓═├╙┬ ┼╤╒ $─018
  1545. ┬╦╟╬─ ┼╤╒ $─020
  1546. ┬╧╥─┼╥ ┼╤╒ $─021
  1547. ╙╙╘┴╥╘ ┼╤╒ 1344 ;ROW└9└IN└SCREEN└MEMORY└AT└1024
  1548.  
  1549.  
  1550. *└╦ERNAL
  1551.  
  1552. ├╚╥╧╒╘ ┼╤╒ $╞╞─2
  1553. ╟┼╘╔╬ ┼╤╒ $╞╞┼4
  1554.  
  1555. *└╙OME└VARIABLES
  1556.  
  1557. ╟╠╧┬╪═╔╬ = $3╞ ;╘HESE└ARE└USED└IN└CLEARING└THE
  1558. ╟╠╧┬╪═┴╪ = $40 ;DRAWING└(GLOBAL)└BUFFER
  1559. ╟╠╧┬┘═╔╬ = $41
  1560. ╟╠╧┬┘═┴╪ = $42
  1561. ╠╧├╪═╔╬ = $57 ;╘HESE└ARE└USED└IN└CLEARING└THE
  1562. ╠╧├╪═┴╪ = $58 ;┼╧╥└(LOCAL)└BUFFER
  1563. ╠╧├┘═╔╬ = $59
  1564. ╠╧├┘═┴╪ = $60
  1565. ╨1╪ = $92 ;╘HESE└ARE└TEMPORARY└STORAGE
  1566. ╨1┘ = $93 ;╒SED└IN└PLOTTING└THE└PROJECTION
  1567. ╨1┌ = $94
  1568. ╨2╪ = $95 ;╘HEY└ARE└HERE└SO└THAT└WE
  1569. ╨2┘ = $96 ;DON'T└HAVE└TO└RECALCULATE└THEM.
  1570. ╨2┌ = $┴┼
  1571. ╨3╪ = $┴╞ ;╘HEY└MAKE└LIFE└EASY.
  1572. ╨3┘ = $┬0
  1573. ╨3┌ = $┬1 ;╫HY└ARE└YOU└LOOKING└AT└ME└LIKE└THAT?
  1574. ╨1╘ = $┬2 ;─ON'T└YOU└TRUST└ME?
  1575. ╨2╘ = $┬3
  1576. ╨3╘ = $┬4 ;╚AVING└ANOTHER└CHILD└WASN'T└MY└IDEA.
  1577. ╔╬─┼╪ = $51
  1578. ├╧╒╬╘╨╘╙ = $52
  1579. ┌╧╧═ = $71 ;┌OOM└FACTOR
  1580. ─╙╪ = $61 ;─╙╪└IS└THE└INCREMENT└FOR
  1581.    ;ROTATING└AROUND└X
  1582. ─╙┘ = $62 ;╙IMILAR└FOR└─╙┘,└─╙┌
  1583. ─╙┌ = $63
  1584. ╙╪ = $64 ;╘HESE└ARE└THE└ACTUAL└ANGLES└IN└X└Y└AND└Z
  1585. ╙┘ = $65
  1586. ╙┌ = $66
  1587. ╘1 = $67 ;╘HESE└ARE└USED└IN└THE└ROTATION
  1588. ╘2 = $68
  1589. ╘3 = $69 ;╙EE└THE└ARTICLE└FOR└MORE└DETAILS
  1590. ╘4 = $6┴
  1591. ╘5 = $6┬
  1592. ╘6 = $6├
  1593. ╘7 = $6─
  1594. ╘8 = $6┼
  1595. ╘9 = $6╞
  1596. ╘10 = $70
  1597. ┴11 = $┴5 ;╘HESE└ARE└THE└ELEMENTS└OF└THE└ROTATION└MATRIX
  1598. ┬12 = $┴6 ;╪┘┌
  1599. ├13 = $┴7
  1600. ─21 = $┴8 ;╘HE└NUMBER└DENOTES└(ROW,COLUMN)
  1601. ┼22 = $┴9
  1602. ╞23 = $┴┴
  1603. ╟31 = $┴┬
  1604. ╚32 = $┴├
  1605. ╔33 = $┴─
  1606.  
  1607.  
  1608. ***└═ACROS
  1609.  
  1610. ═╧╓┼ ═┴├
  1611.  ╠─┴ ]1
  1612.  ╙╘┴ ]2
  1613.  <<<
  1614.  
  1615. ╟┼╘╦┼┘ ═┴├  ;╫AIT└FOR└A└KEYPRESS
  1616. ╫┴╔╘ ╩╙╥ ╟┼╘╔╬
  1617.  ├═╨ #00
  1618.  ┬┼╤ ╫┴╔╘
  1619.  <<<
  1620.  
  1621. ─┼┬╒╟ ═┴├  ;╨RINT└A└CHARACTER
  1622.  ─╧└0└└;─ON'T└ASSEMBLE
  1623.  
  1624.  ╠─┴└#]1
  1625.  ╩╙╥└├╚╥╧╒╘
  1626.  ├╠╔
  1627.  >>> ╟┼╘╦┼┘ ;┴ND└WAIT└TO└CONTINUE
  1628.  ├═╨ #'S' ;═Y└SECRECT└SWITCH└KEY
  1629.  ┬╬┼ ╠1
  1630.  ╩╙╥ ├╠┼┴╬╒╨
  1631.  ╩═╨ ─╧╬┼
  1632. ╠1 ├═╨ #'X' ;═Y└SECRET└ABORT└KEY
  1633.  ┬╬┼ ─╧╬┼
  1634.  ╩═╨ ├╠┼┴╬╒╨
  1635.  ╞╔╬
  1636. ─╧╬┼ <<<
  1637.  
  1638. ─┼┬╒╟┴ ═┴├
  1639.  ─╧└0
  1640.  ╠─┴ ]1
  1641.  ╙╘┴ 1024
  1642.  ╞╔╬
  1643. ─╧╬┼┴ <<<
  1644.  
  1645. *-------------------------------
  1646.  
  1647.  ╠─┴ #$00
  1648.  ╙╘┴ ┬╦╟╬─
  1649.  ╙╘┴ ┬╧╥─┼╥
  1650.  ╠─┴ ╓═├╙┬
  1651.  ┴╬─ #%00001111 ;╙CREEN└MEMORY└TO└1024
  1652.  ╧╥┴ #%00010000
  1653.  ╙╘┴ ╓═├╙┬
  1654.  
  1655.  ╠─┘ #00
  1656.  ╠─┴ #<╘╘┼╪╘
  1657.  ╙╘┴ ╘┼═╨1
  1658.  ╠─┴ #>╘╘┼╪╘
  1659.  ╙╘┴ ╘┼═╨2
  1660.  ╩═╨ ╘╔╘╠┼
  1661. ╘╘┼╪╘ ╚┼╪ 9305111111 ;CLEAR└SCREEN,└WHITE,└CRSR└DN
  1662.  ╘╪╘ '└└└└└└└└└└└└└CUBE3D└V3.2',0D,0D
  1663.  ╘╪╘ '└└└└└└└└└└└└└└└└└└BY',0D
  1664.  ╚┼╪ 9╞ ;CYAN
  1665.  ╘╪╘ '└└└└STEPHEN└JUDD'
  1666.  ╚┼╪ 99
  1667.  ╘╪╘ '└└└└GEORGE└TAYLOR',0D,0D
  1668.  ╚┼╪ 9┬
  1669.  ╘╪╘ '└└CHECK└OUT└THE└JAN.└95└ISSUE└OF',0D
  1670.  ╚┼╪ 96
  1671.  ╘╪╘ '└└C=HACKING'
  1672.  ╚┼╪ 9┬
  1673.  ╘╪╘ '└FOR└MORE└DETAILS!',0D
  1674.  ╚┼╪ 0─1─1─9┼12
  1675.  ╘╪╘ 'F1/F2',92
  1676.  ╘╪╘ '└-└INC/DEC└X-ROTATION',0D
  1677.  ╚┼╪ 1─1─12
  1678.  ╘╪╘ 'F3/F4',92
  1679.  ╘╪╘ '└-└INC/DEC└Y-ROTATION',0D
  1680.  ╚┼╪ 1─1─12
  1681.  ╘╪╘ 'F5/F6',92
  1682.  ╘╪╘ '└-└INC/DEC└Z-ROTATION',0D
  1683.  ╚┼╪ 1─1─12
  1684.  ╘╪╘ '└F7└└',92
  1685.  ╘╪╘ '└-└RESET',0D
  1686.  ╚┼╪ 1─1─12
  1687.  ╘╪╘ '└+/-└',92
  1688.  ╘╪╘ '└-└ZOOM└IN/OUT',0D
  1689.  ╚┼╪ 1─1─12
  1690.  ╘╪╘ '└└H└└',92
  1691.  ╘╪╘ '└-└TOGGLE└HIDDEN└SURFACES',0D
  1692.  ╚┼╪ 1─1─12
  1693.  ╘╪╘ 'SPACE',92
  1694.  ╘╪╘ '└-└TOGGLE└SURFACE└FILLING',0D,0D
  1695.  ╘╪╘ '└└PRESS└Q└TO└QUIT',0D
  1696.  ╚┼╪ 0─05
  1697.  ╘╪╘ '└└└└└└PRESS└ANY└KEY└TO└BEGIN',0D
  1698.  ╚┼╪ 00
  1699. ╘╔╘╠┼ ╠─┴ (╘┼═╨1),┘
  1700.  ┬┼╤ :├╧╬╘
  1701.  ╩╙╥ ├╚╥╧╒╘
  1702.  ╔╬┘
  1703.  ┬╬┼ ╘╔╘╠┼
  1704.  ╔╬├ ╘┼═╨2
  1705.  ╩═╨ ╘╔╘╠┼
  1706. :├╧╬╘ >>> ╟┼╘╦┼┘
  1707.  
  1708. ****└╙ET└UP└TABLES(?)
  1709.  
  1710. *└╘ABLES└ARE└CURRENTLY└SET└UP└IN└┬┴╙╔├
  1711. *└AND└BY└THE└ASSEMBLER.
  1712.  
  1713. ╘┴┬╠┼╙ ╠─┴ #>╘═┴╘╚1
  1714.  ╙╘┴ ┌1+1
  1715.  ╙╘┴ ┌2+1
  1716.  ╠─┴ #>╘═┴╘╚2
  1717.  ╙╘┴ ┌3+1
  1718.  ╙╘┴ ┌4+1
  1719.  
  1720. ****└├LEAR└SCREEN└AND└SET└UP└"BITMAP"
  1721. ╙┼╘╒╨ ╠─┴ #$01 ;╫HITE
  1722.  ╙╘┴ $─021 ;╘HIS└IS└DONE└SO└THAT└OLDER
  1723.  ╠─┴ #147 ;MACHINES└WILL└SET└UP
  1724.  ╩╙╥ ├╚╥╧╒╘
  1725.  ╠─┴ #$00 ;CORRECTLY
  1726.  ╙╘┴ $─021
  1727.  ╠─┴ #<╙╙╘┴╥╘
  1728.  ┴─├ #12 ;╘HE└GOAL└IS└TO└CENTER└THE└GRAPHICS
  1729.  ╙╘┴ ╘┼═╨1 ;├OLUMN└12
  1730.  ╠─┴ #>╙╙╘┴╥╘ ;╥OW└9
  1731.  ╙╘┴ ╘┼═╨1+1 ;╙╙╘┴╥╘└POINTS└TO└ROW└9
  1732.  ╠─┴ #00
  1733.  ╠─┘ #00
  1734.  ╠─╪ #00 ;X└WILL└COUNT└16└ROWS└FOR└US
  1735.  ├╠├
  1736.  
  1737. :╠╧╧╨ ╙╘┴ (╘┼═╨1),┘
  1738.  ╔╬┘
  1739.  ┴─├ #16
  1740.  ┬├├ :╠╧╧╨
  1741.  ├╠├
  1742.  ╠─┴ ╘┼═╨1
  1743.  ┴─├ #40 ;╬EED└TO└ADD└40└TO└THE└BASE└POINTER
  1744.  ╙╘┴ ╘┼═╨1 ;╘O└JUMP└TO└THE└NEXT└ROW
  1745.  ╠─┴ ╘┼═╨1+1
  1746.  ┴─├ #00 ;╘AKE└CARE└OF└CARRIES
  1747.  ╙╘┴ ╘┼═╨1+1
  1748.  ╠─┘ #00
  1749.  ╔╬╪
  1750.  ╘╪┴  ;╪└IS└ALSO└AN└INDEX└INTO└THE└CHARACTER└NUMBER
  1751.  ├╨╪ #16
  1752.  ┬╬┼ :╠╧╧╨ ;╬EED└TO└DO└IT└16└TIMES
  1753.  
  1754. ****└├LEAR└BUFFERS
  1755.  
  1756.  ╠─┴ #<┬╒╞╞1
  1757.  ╙╘┴ ┬╒╞╞┼╥
  1758.  ╠─┴ #>┬╒╞╞1
  1759.  ╙╘┴ ┬╒╞╞┼╥+1
  1760.  ╠─┘ #$00
  1761.  ╠─╪ #24 ;┴SSUMING└ALL└THREE└BUFFERS└ARE
  1762.  ╠─┴ #$00 ;BACK-TO-BACK
  1763. :┬╠╧╧╨ ╙╘┴ (┬╒╞╞┼╥),┘
  1764.  ╔╬┘
  1765.  ┬╬┼ :┬╠╧╧╨
  1766.  ╔╬├ ┬╒╞╞┼╥+1
  1767.  ─┼╪
  1768.  ┬╬┼ :┬╠╧╧╨
  1769.  
  1770. ****└╙ET└UP└BUFFERS
  1771.  
  1772.  ╠─┴ #<┬╒╞╞1
  1773.  ╙╘┴ ┬╒╞╞┼╥
  1774.  ╠─┴ #>┬╒╞╞1
  1775.  ╙╘┴ ┬╒╞╞┼╥+1
  1776.  ╙╘┴ ┌╘┼═╨ ;ZTEMP└WILL└MAKE└LIFE└SIMPLE└FOR└US
  1777.  ╠─┴ ╓═├╙┬
  1778.  ┴╬─ #%11110001 ;╙TART└HERE└SO└THAT└SWAP└BUFFERS└WILL└WORK└RIGHT
  1779.  ╧╥┴ #%00001110
  1780.  ╙╘┴ ╓═├╙┬
  1781.  
  1782. ****└╙ET└UP└INITIAL└VALUES
  1783.  
  1784. ╔╬╔╘ ╠─┴ #00
  1785.  ╙╘┴ ╠╧├╪═╔╬
  1786.  ╙╘┴ ╠╧├╪═┴╪
  1787.  ╙╘┴ ╠╧├┘═╔╬
  1788.  ╙╘┴ ╠╧├┘═┴╪
  1789.  ╙╘┴ ╟╠╧┬╪═╔╬
  1790.  ╙╘┴ ╟╠╧┬┘═╔╬
  1791.  ╙╘┴ ╟╠╧┬╪═┴╪
  1792.  ╙╘┴ ╟╠╧┬┘═┴╪
  1793.  ╙╘┴ ─╙╪
  1794.  ╙╘┴ ─╙┘
  1795.  ╙╘┴ ─╙┌
  1796.  ╙╘┴ ╙╪
  1797.  ╙╘┴ ╙┘
  1798.  ╙╘┴ ╙┌
  1799.  ╙╘┴ ╞╔╠╠
  1800.  ╠─┴ #01
  1801.  ╙╘┴ ╚╔─┼
  1802.  ╠─┴ #64
  1803.  ╙╘┴ ┌╧╧═
  1804.  
  1805. *-------------------------------
  1806. *└═AIN└LOOP
  1807.  
  1808. ****└╟ET└KEYPRESS
  1809.  
  1810. ═┴╔╬
  1811.  ├╠╔
  1812. ╦╨╥┼╙╙ ╩╙╥ ╟┼╘╔╬
  1813.  ├═╨ #133 ;╞1?
  1814.  ┬╬┼ :╞2
  1815.  ╠─┴ ─╙╪
  1816.  ├═╨ #┴╬╟═┴╪/2 ;╬O└MORE└THAN└PI
  1817.  ┬┼╤ :├╧╬╘1
  1818.  ╔╬├ ─╙╪ ;OTHERWISE└INCREASE└X-ROTATION
  1819.  ╩═╨ :├╧╬╘
  1820. :╞2 ├═╨ #137 ;╞2?
  1821.  ┬╬┼ :╞3
  1822.  ╠─┴ ─╙╪
  1823.  ┬┼╤ :├╧╬╘1
  1824.  ─┼├ ─╙╪
  1825.  ╩═╨ :├╧╬╘
  1826. :╞3 ├═╨ #134
  1827.  ┬╬┼ :╞4
  1828.  ╠─┴ ─╙┘
  1829.  ├═╨ #┴╬╟═┴╪/2
  1830.  ┬┼╤ :├╧╬╘1
  1831.  ╔╬├ ─╙┘ ;╔NCREASE└Y-ROTATION
  1832.  ╩═╨ :├╧╬╘
  1833. :╞4 ├═╨ #138
  1834.  ┬╬┼ :╞5
  1835.  ╠─┴ ─╙┘
  1836.  ┬┼╤ :├╧╬╘1
  1837.  ─┼├ ─╙┘
  1838.  ╩═╨ :├╧╬╘
  1839. :╞5 ├═╨ #135
  1840.  ┬╬┼ :╞6
  1841.  ╠─┴ ─╙┌
  1842.  ├═╨ #┴╬╟═┴╪/2
  1843.  ┬┼╤ :├╧╬╘1
  1844.  ╔╬├ ─╙┌ ;Z-ROTATION
  1845.  ╩═╨ :├╧╬╘
  1846. :╞6 ├═╨ #139
  1847.  ┬╬┼ :╞7
  1848.  ╠─┴ ─╙┌
  1849.  ┬┼╤ :├╧╬╘1
  1850.  ─┼├ ─╙┌
  1851.  ╩═╨ :├╧╬╘
  1852. :╞7 ├═╨ #136
  1853.  ┬╬┼ :╨╠╒╙
  1854.  ╩═╨ ╔╬╔╘
  1855. :├╧╬╘1 ╩═╨ :├╧╬╘
  1856. :╨╠╒╙ ├═╨ #'+'
  1857.  ┬╬┼ :═╔╬╒╙
  1858.  ╔╬├ ┌╧╧═ ;┬AH,└WHO└NEEDS└ERROR└CHECKING?
  1859.  ╔╬├ ┌╧╧═
  1860.  ╩═╨ :├╧╬╘
  1861. :═╔╬╒╙ ├═╨ #'-'
  1862.  ┬╬┼ :╚
  1863.  ─┼├ ┌╧╧═
  1864.  ─┼├ ┌╧╧═
  1865.  ┬╨╠ :├╧╬╘
  1866.  ╔╬├ ┌╧╧═
  1867.  ╔╬├ ┌╧╧═
  1868.  ╩═╨ :├╧╬╘
  1869. :╚ ├═╨ #'H'
  1870.  ┬╬┼ :╙╨┴├┼
  1871.  ╠─┴ ╚╔─┼
  1872.  ┼╧╥ #$01
  1873.  ╙╘┴ ╚╔─┼
  1874.  ╩═╨ :├╧╬╘
  1875. :╙╨┴├┼ ├═╨ #'└'
  1876.  ┬╬┼ :╤
  1877.  ╠─┴ ╞╔╠╠
  1878.  ┼╧╥ #$01
  1879.  ╙╘┴ ╞╔╠╠
  1880.  ╩═╨ :├╧╬╘
  1881. :╤ ├═╨ #'Q' ;Q└QUITS
  1882.  ┬╬┼ :├╧╬╘
  1883.  ╩═╨ ├╠┼┴╬╒╨
  1884.  
  1885. :├╧╬╘ ╙┼╔  ;╙PEED└THINGS└UP└A└BIT
  1886.  
  1887. ****└╒PDATE└ANGLES
  1888.  
  1889. ╒╨─┴╘┼ ├╠├
  1890.  ╠─┴ ╙╪
  1891.  ┴─├ ─╙╪
  1892.  ├═╨ #┴╬╟═┴╪ ;┴RE└WE└>=└MAXIMUM└ANGLE?
  1893.  ┬├├ :├╧╬╘1
  1894.  ╙┬├ #┴╬╟═┴╪ :╔F SO, RESET
  1895. :├╧╬╘1 ╙╘┴ ╙╪
  1896.  ├╠├
  1897.  ╠─┴ ╙┘
  1898.  ┴─├ ─╙┘
  1899.  ├═╨ #┴╬╟═┴╪
  1900.  ┬├├ :├╧╬╘2
  1901.  ╙┬├ #┴╬╟═┴╪ ;╙AME└DEAL
  1902. :├╧╬╘2 ╙╘┴ ╙┘
  1903.  ├╠├
  1904.  ╠─┴ ╙┌
  1905.  ┴─├ ─╙┌
  1906.  ├═╨ #┴╬╟═┴╪
  1907.  ┬├├ :├╧╬╘3
  1908.  ╙┬├ #┴╬╟═┴╪
  1909. :├╧╬╘3 ╙╘┴ ╙┌
  1910.  
  1911. ****└╥OTATE└COORDINATES
  1912.  
  1913. ╥╧╘┴╘┼
  1914.  
  1915. ***└╞IRST,└CALCULATE└T1,T2,...,T10
  1916.  
  1917. **└╘WO└MACROS└TO└SIMPLIFY└OUR└LIFE
  1918. ┴──┴ ═┴├  ;┴DD└TWO└ANGLES└TOGETHER
  1919.  ├╠├
  1920.  ╠─┴ ]1
  1921.  ┴─├ ]2
  1922.  ├═╨ #┴╬╟═┴╪ ;╔S└THE└SUM└>└2*PI?
  1923.  ┬├├ ─╧╬┼
  1924.  ╙┬├ #┴╬╟═┴╪ ;╔F└SO,└SUBTRACT└2*PI
  1925. ─╧╬┼ <<<
  1926.  
  1927. ╙╒┬┴ ═┴├  ;╙UBTRACT└TWO└ANGLES
  1928.  ╙┼├
  1929.  ╠─┴ ]1
  1930.  ╙┬├ ]2
  1931.  ┬├╙ ─╧╬┼
  1932.  ┴─├ #┴╬╟═┴╪ ;╧OPS,└WE└NEED└TO└ADD└2*PI
  1933. ─╧╬┼ <<<
  1934.  
  1935. **└╬OW└CALCULATE└T1,T2,ETC.
  1936.  
  1937.  >>> ╙╒┬┴,╙┘;╙┌
  1938.  ╙╘┴ ╘1 ;T1=SY-SZ
  1939.  >>> ┴──┴,╙┘;╙┌
  1940.  ╙╘┴ ╘2 ;T2=SY+SZ
  1941.  >>> ┴──┴,╙╪;╙┌
  1942.  ╙╘┴ ╘3 ;T3=SX+SZ
  1943.  >>> ╙╒┬┴,╙╪;╙┌
  1944.  ╙╘┴ ╘4 ;T4=SX-SZ
  1945.  >>> ┴──┴,╙╪;╘2
  1946.  ╙╘┴ ╘5 ;T5=SX+T2
  1947.  >>> ╙╒┬┴,╙╪;╘1
  1948.  ╙╘┴ ╘6 ;T6=SX-T1
  1949.  >>> ┴──┴,╙╪;╘1
  1950.  ╙╘┴ ╘7 ;T7=SX+T1
  1951.  >>> ╙╒┬┴,╘2;╙╪
  1952.  ╙╘┴ ╘8 ;T8=T2-SX
  1953.  >>> ╙╒┬┴,╙┘;╙╪
  1954.  ╙╘┴ ╘9 ;T9=SY-SX
  1955.  >>> ┴──┴,╙╪;╙┘
  1956.  ╙╘┴ ╘10 ;T10=SX+SY
  1957.  
  1958. *└┼T└VOILA!
  1959.  
  1960. ***└╬EXT,└CALCULATE└┴,┬,├,...,╔
  1961.  
  1962. **└┴NOTHER└USEFUL└LITTLE└MACRO
  1963. ─╔╓2 ═┴├  ;─IVIDE└A└SIGNED└NUMBER└BY└2
  1964. ;╔T└IS└ASSUMED└THAT└THE└NUMBER
  1965.  ┬╨╠ ╨╧╙ ;IS└IN└THE└ACCUMULATOR
  1966.  ├╠├
  1967.  ┼╧╥ #$╞╞ ;╫E└NEED└TO└UN-NEGATIVE└THE└NUMBER
  1968.  ┴─├ #01 ;BY└TAKING└IT'S└COMPLEMENT
  1969.  ╠╙╥  ;DIVIDE└BY└TWO
  1970.  ├╠├
  1971.  ┼╧╥ #$╞╞
  1972.  ┴─├ #01 ;═AKE└IT└NEGATIVE└AGAIN
  1973.  ╩═╨ ─╧╬┼─╔╓
  1974. ╨╧╙ ╠╙╥  ;╬UMBER└IS└POSITIVE
  1975. ─╧╬┼─╔╓ <<<
  1976.  
  1977. ═╒╠2 ═┴├  ;═ULTIPLY└A└SIGNED└NUMBER└BY└2
  1978.  ┬╨╠ ╨╧╙═
  1979.  ├╠├
  1980.  ┼╧╥ #$╞╞
  1981.  ┴─├ #$01
  1982.  ┴╙╠
  1983.  ├╠├
  1984.  ┼╧╥ #$╞╞
  1985.  ┴─├ #$01
  1986.  ╩═╨ ─╧╬┼═╒╠
  1987. ╨╧╙═ ┴╙╠
  1988. ─╧╬┼═╒╠ <<<
  1989.  
  1990.